覆盖2D numpy失败.narray在循环中



我发现我的程序无法覆盖np。narray (X变量)在for循环中使用赋值语句,如"X[i] =另一个np。具有匹配形状的数组。我不知道这是怎么发生的……

代码:

import numpy as np
def qr_tridiagonal(T: np.ndarray):
m, n = T.shape
X = T.copy()
Qt = np.identity(m)
for i in range(n-1):
ai = X[i, i]
ak = X[i+1, i]
c = ai/(ai**2 + ak**2)**.5
s = ak/(ai**2 + ak**2)**.5
# Givens rotation
tmp1 = c*X[i] + s*X[i+1]
tmp2 = c*X[i+1] - s*X[i]
print("tmp1 before:", tmp1)
print("X[i] before:", X[i])
X[i] = tmp1
X[i+1] = tmp2
print("tmp1 after:", tmp1)
print("X[i] after:", X[i])
print()
print(X)
return Qt.T, X

A = np.array([[1, 1, 0, 0], [1, 1, 1, 0], [0, 1, 1, 1], [0, 0, 1, 1]])
Q, R = qr_tridiagonal(A)

输出(前四行):

tmp1 before: [1.41421356 1.41421356 0.70710678 0.        ]
X[i] before: [1 1 0 0]
tmp1 after: [1.41421356 1.41421356 0.70710678 0.        ]
X[i] after: [1 1 0 0]

虽然X[i]是由tmp1赋值的,但数组X[i]或X[i,:]中的值保持不变。希望有人能帮帮我....

其他信息:以上是一个使用给定旋转计算三对角矩阵QR分解的函数。

我确实检查了给X[I]赋常量值是否有效,例如X[I] = 10,那么打印的结果就符合这个语句。但是如果X[i] = someArray,那么在我的代码中它将失败。我不确定这是否是由我在上述代码中实现的算法触发的特定问题,因为这种情况以前从未发生过。

我确实尝试使用conda安装新环境以确保我的python没有问题。上述奇怪的输出应该能够在其他设备上重新生成。

非常感谢@hpaulj

原来是数据类型的问题。程序正常,但输入数据类型为int,这会导致中间转换错误。

一个教训:注意np. narray的dtype !

最新更新