python – 基本Numpy数组值赋值

作为一个小练习,我开始在 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,2]])
    ldlt(A)

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

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

但是在运行代码时,它似乎设置为0.为什么?
必须有一些基本的东西,我还没有真正理解?

在此先感谢所有帮助我的人.

编辑1:

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

解决方法

以下内容可能显示正在发生的事情:
>>> A = np.array([[2,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.

以同样的价格,这是一个更加努力的方式来做你所追求的:通常要避免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,2]])
>>> ldlt_np(A)
array([[ 2.,-0.5,0. ],[-1.,2.,-0.5],[ 0.,-1.,2. ]])

相关文章

我最近重新拾起了计算机视觉,借助Python的opencv还有face_r...
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Poolin...
记得大一学Python的时候,有一个题目是判断一个数是否是复数...
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic ...
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic v...
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic ...