【问题标题】:Fail to overwrite a 2D numpy.ndarray in a loop无法在循环中覆盖 2D numpy.ndarray
【发布时间】:2022-12-04 01:02:18
【问题描述】:

我发现我的程序无法通过赋值语句覆盖 for 循环中的 np.ndarray(X 变量),例如“X[i] = another np.ndarray with matched shape”。我不知道这怎么会发生...

代码:

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)

输出(前 4 行):

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, :] 中的值保持不变。希望有人能帮帮我....

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

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

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

【问题讨论】:

  • Aint dtype。它不能采用浮点值。
  • @hpaulj 非常非常感谢!!!!

标签: python numpy multidimensional-array


【解决方案1】:

非常感谢@hpaulj

原来是数据类型的问题。程序没问题,但是输入的数据类型是int,导致中间的截断错误。

一个教训:注意 np.ndarray 的数据类型!

【讨论】:

    猜你喜欢
    • 2014-09-02
    • 2017-01-03
    • 2013-09-27
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多