4

假设我有一个数组

    a = numpy.arange(8*6*3).reshape((8, 6, 3))
    #and another:
    l = numpy.array([[0,0],[0,1],[1,1]]) #an array of indexes to array "a"
    #and yet another:
    b = numpy.array([[0,0,5],[0,1,0],[1,1,3]])

其中“l”和“b”长度相等,我想说

    a[l] = b

这样 a[0][0] 变为 [0,0,5],a[0][1] 变为 [0,1,0] 等等。

当我得到一维数组时它似乎工作正常,但它给了我错误

    ValueError: array is not broadcastable to correct shape

当我尝试使用 3 维数组时。

4

2 回答 2

3
import numpy as np

a = np.arange(8*6*3).reshape((8, 6, 3))
l = np.array([[0,0],[0,1],[1,1]]) #an array of indexes to array "a"
b = np.array([[0,0,5],[0,1,0],[1,1,3]])

a[tuple(l.T)] = b
print(a[0,0])
# [0 0 5]

print(a[0,1])
# [0 1 0]

print(a[1,1])
# [1 1 3]

安妮阿奇博尔德说

当您在所有索引槽中提供数组时,您返回的内容与您放入的数组具有相同的形状;所以如果你提供一维列表,比如

A[[1,2,3],[1,4,5],[7,6,2]]

你得到的是

[A[1,1,7],A[2,4,6],A[3,5,2]]

当您将其与您的示例进行比较时,您会看到

a[l] = b告诉 NumPy 设置

a[0,0,1] = [0,0,5]
a[0,1,1] = [0,1,0]

并留下b未分配的第三个元素。这就是您收到错误的原因

ValueError: array is not broadcastable to correct shape

解决方案是将数组转置l为正确的形状:

In [50]: tuple(l.T)
Out[50]: (array([0, 0, 1]), array([0, 1, 1]))

(您也可以使用zip(*l),但tuple(l.T)要快一些。)

于 2012-06-17T13:45:08.770 回答
0

或者您可以使用相同的阵列

for i in range(len(l)):
    a[l[i][0]][l[i][1]]=b[i]
于 2012-06-17T13:55:57.227 回答