假设我有一个数组
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
使得[0] [0]变为[0,0,5],[0] [1]变为[0,1,0]等。
当我得到一维数组时似乎工作正常,但它给了我错误
ValueError: array is not broadcastable to correct shape
当我尝试使用三维数组时。
答案 0 :(得分: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)
会更快一些。)
答案 1 :(得分:0)
或者使用相同的数组,您可以使用
for i in range(len(l)):
a[l[i][0]][l[i][1]]=b[i]