Python:matrix height>;时,使用numpy将迭代赋值转换为原子赋值不起作用;256
Python:matrix height>;时,使用numpy将迭代赋值转换为原子赋值不起作用;256,python,performance,for-loop,numpy,matrix,Python,Performance,For Loop,Numpy,Matrix,我正在使用numpy1.6.2和python2.7 给定一个nxmxd矩阵A和一个包含索引列表的矩阵I。 我必须根据I中找到的索引,用a的元素之和填充一个零矩阵ACopy。 这是我的密码: ACopy = zeros(A.shape) for j in xrange(0, size(A, 0)): i = I[j] ACopy[j, i, :] = A[j, i, :] + A[j, i + 1, :] 指数矩阵: I = array([2, 0, 3, 2, 1]) A矩阵: A
我正在使用numpy1.6.2和python2.7
给定一个
nxmxd
矩阵A
和一个包含索引列表的矩阵I
。我必须根据
I
中找到的索引,用a
的元素之和填充一个零矩阵ACopy
。这是我的密码:
ACopy = zeros(A.shape)
for j in xrange(0, size(A, 0)):
i = I[j]
ACopy[j, i, :] = A[j, i, :] + A[j, i + 1, :]
指数矩阵:
I = array([2, 0, 3, 2, 1])
A
矩阵:
A = array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]],
[[15, 16, 17],
[18, 19, 20],
[21, 22, 23],
[24, 25, 26],
[27, 28, 29]],
[[30, 31, 32],
[33, 34, 35],
[36, 37, 38],
[39, 40, 41],
[42, 43, 44]],
[[45, 46, 47],
[48, 49, 50],
[51, 52, 53],
[54, 55, 56],
[57, 58, 59]],
[[60, 61, 62],
[63, 64, 65],
[66, 67, 68],
[69, 70, 71],
[72, 73, 74]]])
我试图通过以下方式改进代码,避免for循环:
r = r_[0:len(I)]
ACopy[r, I, :] = A[r, I, :] + A[r, I + 1, :]
我注意到输出矩阵ACopy
不同,我不明白为什么。有什么想法吗?谢谢大家! EDIT:我正在计算大量矩阵,并尝试使用
np.array_equals(ACopy1,ACopy2)
,其中ACopy1
是第一个方法的输出,ACopy2
是第二个方法的输出。有时矩阵是相同的,但不是每次都一样。这两种方法的输出应该相同,或者是否存在bordeline情况
EDIT2:我注意到只有当矩阵高度大于256时才会发生这种奇怪的行为。
这是我的测试套件:
from numpy import *
w = 5
h = 257
for i in xrange(1000):
Z = random.rand(w, h, 5)
I = (random.rand(w) * h - 1).astype(uint8)
r = r_[0:w]
ZCopy = zeros(Z.shape)
ZCopy2 = zeros(Z.shape)
for j in xrange(0, size(Z, 0)):
i = I[j]
ZCopy[j, i, :] = Z[j, i, :] + Z[j, i + 1, :]
ZCopy2[r, I, :] = Z[r, I, :] + Z[r, I + 1, :]
if (ZCopy - ZCopy2).any() > 0:
print(ZCopy, ZCopy2, I)
raise ValueError
我明白了我将矩阵I转换为uint8,因此矩阵I元素介于0和255之间。
我使用
I=(random.rand(w)*h-1)解析astype(uint32)
这两个代码为我生成相同的结果,但我确实使用了更新版本的NumpyNote,即I
必须是Numpy数组才能工作。请向我们展示一些新方法和旧方法不同的小示例输入。