Python:当矩阵高度>256时,使用numpy将迭代赋值转换为原子赋值不起作用

2024-09-29 21:49:37 发布

您现在位置:Python中文网/ 问答频道 /正文


我正在使用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

Tags: 方法代码inforsizezeros矩阵array

热门问题