我该如何简化:
import numpy as np
ex = np.arange(27).reshape(3, 3, 3)
def get_plane(axe, index):
return ex.swapaxes(axe, 0)[index] # is there a better way ?
我找不到一个numpy函数来获得一个高维数组中的平面,有吗?
ex.take(index, axis=axe)
方法很棒,但是它复制了数组而不是提供我最初想要的视图。
那么,索引(不复制)第n维数组以获取带有索引和轴的二维切片的最短方法是什么?
受this answer的启发,您可以执行以下操作:
def get_plane(axe, index):
slices = [slice(None)]*len(ex.shape)
slices[axe]=index
return ex[tuple(slices)]
get_plane(1,1)
输出:
array([[ 3, 4, 5],
[12, 13, 14],
[21, 22, 23]])
您所说的“飞机”是什么意思?
In [16]: ex = np.arange(27).reshape(3, 3, 3)
诸如平面,行和列的名称是任意约定,未在numpy中正式定义。该数组的默认显示看起来像3个“平面”或“块”,每个都有行和列:
In [17]: ex
Out[17]:
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],
[24, 25, 26]]])
标准索引使我们可以在任何维度上查看任何2d块:
In [18]: ex[0]
Out[18]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [19]: ex[0,:,:]
Out[19]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [20]: ex[:,0,:]
Out[20]:
array([[ 0, 1, 2],
[ 9, 10, 11],
[18, 19, 20]])
In [21]: ex[:,:,0]
Out[21]:
array([[ 0, 3, 6],
[ 9, 12, 15],
[18, 21, 24]])
[可以说我要在维1中使用块0等,但是首先请确保您了解此索引。这是核心的numpy功能。
In [23]: np.take(ex, 0, 1)
Out[23]:
array([[ 0, 1, 2],
[ 9, 10, 11],
[18, 19, 20]])
In [24]: idx = (slice(None), 0, slice(None)) # also np.s_[:,0,:]
In [25]: ex[idx]
Out[25]:
array([[ 0, 1, 2],
[ 9, 10, 11],
[18, 19, 20]])
是的,您可以交换轴(或换位),它适合您的需求。