我有一个非常大的 2D numpy 数组 (A) 和一个较小的 2D 数组 (B),它的两个维度都较小。B是正方形。我有一个与 B 长度相同的索引数组。如下所示:
A = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]])
B = np.array([[2, 4, 5, 7],
[2, 7, 1, 3],
[6, 1, 3, 5],
[1, 6, 3, 2]])
Index = np.array([0, 1, 5, 6])
我想将B的内容添加到Index定义的行和列中的A中。A不一定全是0,所以需要加法。结果如下:
R = np.array([2, 4, 0, 0, 0, 5, 7, 0, 0],
[2, 7, 0, 0, 0, 1, 3, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[6, 1, 0, 0, 0, 3, 5, 0, 0],
[1, 6, 0, 0, 0, 3, 2, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]])
我尝试这样做:
A[Index, Index] += B
这给了我以下错误ValueError: shape mismatch: value array of shape (4,4) could not be broadcast to indexing result of shape (4,)
我不明白为什么这不起作用,因为我可以这样做:
A[Index, Index[0]:Index[0]+4] = B
然后值将全部出现在正确的行中,但不会出现在正确的列中。这是有道理的,因为我只是给它一个 4 列的块来让它出现在其中,但我希望它出现在 Index 定义的列中。
我还尝试了 np.add.at(A[Index], Index, B) 这让我觉得IndexError: index 6 is out of bounds for axis 0 with size 4.
我不明白为什么它尝试访问 B 中的索引 6,其大小为 4。
数组索引使用
broadcasting
. 使用 2 (4,) 数组作为索引,产生 s (4,) 形状结果:ix_
生成 (4,1) 和 (1,4) 数组。这些一起广播以索引 (4,4) 形状:与您的匹配
B
:有一个主要的 numpy 索引页面,这些细节在 参考资料
advanced indexing
部分中处理。您可以尝试使用
np.repeat()
在行轴上重复索引,并np.tile()
在列轴上重复索引。这将为您提供具有以下模式的索引:
然后,您可以用它来索引 A。
(
B.flatten()
这是必需的,因为左侧的形状也被展平。)结果: