【问题标题】:Basic Numpy array value assignment基本 Numpy 数组赋值
【发布时间】:2013-02-08 07:58:18
【问题描述】:

作为我开始在 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(由我的调试器报告)。

【问题讨论】:

    标签: python arrays numpy variable-assignment operation


    【解决方案1】:

    numpy 数组具有固定类型。以后不能将 int 数组更改为浮点数。将数组初始化为浮点数组:

    A = numpy.array([[2, -1, 0], [-1, 2, -1], [0, -1, 2]], numpy.float)
    

    【讨论】:

    • 我在 python 3.3 上。检查我的代码 - Tmp 在评估时变为 0.5。
    【解决方案2】:

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

    >>> 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. ]])
    

    【讨论】:

    • 是的,就是这样。非常感谢 - 我要等很长时间才能偶然发现这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 2011-03-04
    • 1970-01-01
    • 2020-07-31
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    相关资源
    最近更新 更多