NumPy,将一个数组映射到另一个数组的部分

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

当我尝试使用一个三维数组时。

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]

Anne Archibald说

当你在所有索引位置都提供数组时,你得到的返回结果与你放入的数组具有相同的形状; 因此,如果你提供一维列表,例如

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)稍微快一些。)

使用“a [zip(* l)]”时,我遇到了以下错误:Traceback(most recent call last): File“C:/Python32/test.py”,第7行,在<module>中 a [zip(* l)] = b IndexError:索引必须是int或序列 - Vegard J.

0

或者你可以使用相同的数组

for i in range(len(l)):
    a[l[i][0]][l[i][1]]=b[i]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接