a=np.arange(240).reshape(3,4,20)
b=np.arange(12).reshape(3,4)
c=np.zeros((3,4),dtype=int)
x=np.arange(3)
y=np.arange(4)
我想在没有循环的情况下通过以下步骤获得2d(3,4)形状阵列。
for i in x:
c[i]=a[i,y,b[i]]
c
array([[ 0, 21, 42, 63],
[ 84, 105, 126, 147],
[168, 189, 210, 231]])
我试过了,
c=a[x,y,b]
但它显示
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (4,) (3,4)
然后我还试图通过newaxis
建立[:,None]
,它也不起作用。
答案 0 :(得分:3)
尝试:
>>> a[x[:,None], y[None,:], b]
array([[ 0, 21, 42, 63],
[ 84, 105, 126, 147],
[168, 189, 210, 231]])
您尝试了a[x,y,b]
。请注意错误消息:
>>> a[x, y, b]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: shape mismatch: indexing arrays could not be broadcast
together with shapes (3,) (4,) (3,4)
(3,)
表示我们需要将x
扩展为第一个维度为3,第二个维度为4。我们通过指定x[:,None]
(实际上允许将x
广播到任意大小的第二维)来执行此操作。
同样,错误消息显示我们需要将y
映射到(3,4)
形状,然后我们使用y[None,:]
执行此操作。
如果有人愿意,我们可以将None
替换为np.newaxis
:
>>> a[x[:,np.newaxis], y[np.newaxis,:], b]
array([[ 0, 21, 42, 63],
[ 84, 105, 126, 147],
[168, 189, 210, 231]])
np.newaxis
为无:
>>> np.newaxis is None
True
(如果我没记错的话,numpy
的某些早期版本为newaxis
使用了不同的大小写样式。但是,对于所有版本,None
似乎都有效。)
答案 1 :(得分:1)
类似但不同,硬编码不是通用的。
>>> b = np.ravel(a)[np.arange(0,240,21)]
>>> b.reshape((3,4))
array([[ 0, 21, 42, 63],
[ 84, 105, 126, 147],
[168, 189, 210, 231]])
>>>