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.2python2.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数组才能工作。请向我们展示一些新方法和旧方法不同的小示例输入。