python - 基本 Numpy 数组值赋值

标签 python arrays numpy variable-assignment operation

作为我开始在 python 中使用数字代码之前的一个小练习,我正在尝试制作一个 LDLT 算法。只是为了“弄湿脚”。

但是我似乎对 numpy 数组缺乏基本的了解。请参阅以下示例:

def ldlt(Matrix):
    import numpy

    (NRow, NCol) = Matrix.shape

    for col in range(NCol):
        Tmp = 1/Matrix[col,col]
        for D in range(col+1, NCol):
            Matrix[col,D] = Matrix[D,col]*Tmp  
            
if __name__ == '__main__':
    import numpy
    A = numpy.array([[2,-1,0],[-1,2,-1],[0,-1,2]])
    ldlt(A)

该示例不是我正在处理的完整代码。但是,尝试运行它,并在 Matrix[col,D] = ... 处设置一个断点

我对第一次评估的期望是第 0 行第 1 列(起始值为 -1)设置为 = -1*(1/2) = -0.5。

然而,当运行代码时,它似乎被设置为 0。为什么? 一定有一些基本的东西我还没有真正理解吗?

在此先感谢大家对我的帮助。

编辑 1:

Python 版本:3.3 Tmp.: 变为 0.5(由我的调试器报告)。

最佳答案

以下可能会显示正在发生的事情:

>>> A = np.array([[2,-1,0],[-1,2,-1],[0,-1,2]])
>>> A.dtype
dtype('int32')
>>> A[0, 1]
-1
>>> A[0, 1] * 0.5
-0.5
>>> A[0, 1] *= 0.5
>>> A[0, 1]
0
>>> int(-0.5)
0

您的数组只能容纳 32 位整数,因此您尝试分配给它的任何浮点值都将被强制转换(即截断)为 int32。


以同样的价格,这里有一个更 numpythonic 的方法来做你想要的事情:通常要避免 for 循环,因为它们破坏了 numpy 的全部目的:

def ldlt_np(arr) :
    rows, cols = arr.shape
    tmp = 1 / np.diag(arr) # this is a float array
    mask = np.tril_indices(cols)
    ret = arr * tmp[:, None] # this will also be a float array
    ret[mask] = arr[mask]

    return ret

>>> A = np.array([[2,-1,0],[-1,2,-1],[0,-1,2]])
>>> ldlt_np(A)
array([[ 2. , -0.5,  0. ],
       [-1. ,  2. , -0.5],
       [ 0. , -1. ,  2. ]])

关于python - 基本 Numpy 数组值赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15028606/

相关文章:

python - 对基于坐标的数据进行插值以生成网格

python - 使用 sqlalchemy 在 sqlite 数据库中保存 numpy 整数

numpy - 在 numpy/pytorch 中使用 bool 数组或索引数组进行索引更快吗?

javascript - 按升序对本地存储分数进行排序

python - Python : prohibit instantiation 中没有抽象方法的抽象数据类

python - 在Python中将用户昵称转换为正式名字

python - 在同一 Python 进程中同时使用 h5py 和 pytables

arrays - Powershell从CSV文件中的所有列构建所有可能组合的数组

javascript - 通过 Array.prototype.slice() 更改克隆数组会影响原始数组

python - 使用 Python 要求网页运行搜索