在 Python 中使用高级索引进行 nd 数组收缩的简单方法
Easy way to do nd-array contraction using advanced indexing in Python
我知道一定有一种优雅的方法可以使用高级索引来做到这一点,我就是想不出来。
假设我有 (2,3,4) 数组
x = array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
和 (4,) 数组 y = array([1,0,1,1])
获得(3,4)数组最优雅的方法是什么
z = np.zeros((3,4))
for ii in xrange(3):
for jj in xrange(4):
z[ii,jj] = x[y[jj],ii,jj]
生产?
In [490]: x[y,:,np.arange(4)]
Out[490]:
array([[12, 16, 20],
[ 1, 5, 9],
[14, 18, 22],
[15, 19, 23]])
我们需要转置这个。通过混合使用基本索引和高级索引,切片维度已放在最后:
In [491]: x[y,:,np.arange(4)].T
Out[491]:
array([[12, 1, 14, 15],
[16, 5, 18, 19],
[20, 9, 22, 23]])
(在一些 SO 中记录并讨论了 basic/advanced 怪癖。)
或使用高级索引:
In [492]: x[y,np.arange(3)[:,None],np.arange(4)]
Out[492]:
array([[12, 1, 14, 15],
[16, 5, 18, 19],
[20, 9, 22, 23]])
我知道一定有一种优雅的方法可以使用高级索引来做到这一点,我就是想不出来。
假设我有 (2,3,4) 数组
x = array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
和 (4,) 数组 y = array([1,0,1,1])
获得(3,4)数组最优雅的方法是什么
z = np.zeros((3,4))
for ii in xrange(3):
for jj in xrange(4):
z[ii,jj] = x[y[jj],ii,jj]
生产?
In [490]: x[y,:,np.arange(4)]
Out[490]:
array([[12, 16, 20],
[ 1, 5, 9],
[14, 18, 22],
[15, 19, 23]])
我们需要转置这个。通过混合使用基本索引和高级索引,切片维度已放在最后:
In [491]: x[y,:,np.arange(4)].T
Out[491]:
array([[12, 1, 14, 15],
[16, 5, 18, 19],
[20, 9, 22, 23]])
(在一些 SO 中记录并讨论了 basic/advanced 怪癖。)
或使用高级索引:
In [492]: x[y,np.arange(3)[:,None],np.arange(4)]
Out[492]:
array([[12, 1, 14, 15],
[16, 5, 18, 19],
[20, 9, 22, 23]])