简化数字表达式



我怎样才能简化这个:

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 维数组以获得它的 2d 切片(带有索引和轴(的最短方法是什么?

受这个答案的启发,你可以做这样的事情:

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]])

是的,您可以交换轴(或转置(,它适合您的需求。

最新更新