【问题标题】:Simplify numpy expression [duplicate]简化numpy表达式[重复]
【发布时间】:2020-06-05 18:44:04
【问题描述】:

如何简化:

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 切片的最短方法是什么?

【问题讨论】:

  • 想你是np.take : np.take(ex, index, axis=axe)

标签: python-3.x numpy multidimensional-array


【解决方案1】:

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

【讨论】:

  • 很好的答案:这真的可以理解,它提供了数组的视图而不是复制,比如np.take
【解决方案2】:

“飞机”是什么意思?

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

标准索引让我们可以在任何维度查看任何二维块:

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

是的,您可以交换轴(或转置),以满足您的需求。

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多