[英]Basic Numpy array value assignment
作为一个小练习,我开始在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.为什么? 必须有一些基本的东西,我还没有真正理解?
在此先感谢所有帮助我的人。
Python Ver。: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。
以同样的价格,这是一个更加努力的方式来做你所追求的:通常要避免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. ]])
numpy
数组有固定类型。 您不能稍后将int
数组更改为浮点数。 将数组初始化为浮点数组:
A = numpy.array([[2, -1, 0], [-1, 2, -1], [0, -1, 2]], numpy.float)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.