我正在使用numpy1.6.2和python2.7
给定一个N x M x D
矩阵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
是不同的,我不明白为什么。你知道吗?
谢谢大家!你知道吗
编辑:我正在计算很多矩阵,我尝试使用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)
解析相关问题 更多 >
编程相关推荐