Срез Numpy не обновляется, как ожидалось

#python #numpy #array-broadcasting

Вопрос:

Я написал алгоритм для LU-декомпозиции квадратной матрицы. Проблема, с которой я сталкиваюсь, заключается в том, что значения в срезе 2-d массива NumPy обновляются не так, как ожидалось. Смотрите изображение внизу.

Матрица A определяется следующим образом:

 A = np.array([[1, -3, 5, 2], [1, 0, 1, -1], [6, 1, -9, 2], [1, 0, -6, 3]])
 

Алгоритм:

 def LUGAUSS(A):
  if A.shape[0] != A.shape[1]:
    return "Invalid Matrix. A must be a square marix."

  multipliers = dict()
  for i in range(A.shape[0]):
    print('i',i)
    if A[i,i] == 0:
      return "Pivot is zero"
    else:
      multipliers[(i 1,i)] = A[i 1:,i] / A[i,i]
      A[i 1:,i] =  multipliers[(i 1,i)] # <- !!This line is the problem!!
      A[i 1:,i 1:] = A[i 1:,i 1:] -  A[i 1:,i].reshape(-1,1) * A[i,i 1:].reshape(1,-1)
     
    
  L = np.eye(A.shape[0])
  for x in range(L.shape[1]):
    L[x 1:,x] = multipliers[(x 1,x)]

  U = A.copy()
  for x in range(U.shape[1]):
    U[x 1:,x] = 0 

  return (L,U,multipliers)
 

Следующее обновление должно изменить [6,1] на [6.333,1].

Смотрите изображение:

Img

Ответ №1:

B является целочисленным массивом, поэтому входящие значения преобразуются в целые числа. Если вам нужны поплавки. вы должны использовать astype для преобразования B в float64.