2012-06-17 68 views
4

份可以说我有一个阵列numpy的,映射一个阵列到另一个

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],a [0] [1]变成[0,1,0]等

它似乎工作正常时,维数组,但它给我的错误

ValueError: array is not broadcastable to correct shape 

当我尝试将其与3维阵列。

回答

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 says

When you are supplying arrays in all index slots, what you get back has the same shape as the arrays you put in; so if you supply one-dimensional lists, like

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

what you get is

[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)是有点快。)

+0

以 “一[邮编(* 1)]” 我得到这个错误:回溯(最近通话最后一个): 文件 “C:/Python32/test.py”,7号线,在 一个[邮编(* L )] = b IndexError:索引必须是一个整数或序列 –

+0

感谢,用“元组(LT)”它的工作原理;) –

0

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

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