【问题标题】:numpy array slicing, get one from each third dimensionnumpy数组切片,从每个第三维获取一个
【发布时间】:2012-10-26 16:12:12
【问题描述】:

我有一个 3D 数据数组。我有一个二维索引数组,其中形状与数据数组的前两个维度相匹配,并且它指定了我想从数据数组中提取的索引以创建一个二维数组。例如:

 from numpy import *
 a = arange(3 * 5 * 7).reshape((3,5,7))
 getters = array([0,1,2] * (5)).reshape(3,5)

我正在寻找的是像a[:, :, getters] 这样的语法,它通过独立索引到每个项目的第三维来返回一个形状为 (3,5) 的数组。但是,a[:, :, getters] 返回一个形状为 (3,5,3,5) 的数组。我可以通过迭代和构建一个新数组来做到这一点,但这很慢:

 array([[col[getters[ri,ci]] for ci,col in enumerate(row)] for ri,row in enumerate(a)])
 # gives array([[  0,   8,  16,  21,  29],
 #    [ 37,  42,  50,  58,  63],
 #    [ 71,  79,  84,  92, 100]])

有没有简洁+快速的方法?

【问题讨论】:

    标签: python multidimensional-array numpy indexing


    【解决方案1】:

    如果我理解正确的话,我已经使用花哨的索引做了类似的事情:

    >>> k,j = np.meshgrid(np.arange(a.shape[1]),np.arange(a.shape[0]))
    >>> k
    array([[0, 1, 2, 3, 4],
           [0, 1, 2, 3, 4],
           [0, 1, 2, 3, 4]])
    >>> j
    array([[0, 0, 0, 0, 0],
           [1, 1, 1, 1, 1],
           [2, 2, 2, 2, 2]])
    >>> a[j,k,getters]
    array([[  0,   8,  16,  21,  29],
           [ 37,  42,  50,  58,  63],
           [ 71,  79,  84,  92, 100]])
    

    当然,您可以保留kj 并随时使用它们。正如 DSM 在下面的 cmets 中指出的那样,j,k = np.indices(a.shape[:2]) 也应该代替meshgrid 起作用。哪个更快(显然)取决于您使用的元素数量。

    【讨论】:

    • 小调整:j,k = np.indices(a.shape[:2]).
    • indices 是一个非常好的函数,但在短期测试中,它的性能比 meshgrid 低 2 到 3 倍
    • @EnricoGiampieri:确实如此,尽管np.indices 胜过更大的阵列;我在大约 10^6 个元素处得到交叉。
    • @DMS 我想这取决于机器,对于 10^6 个元素( shape (50,50,50) )我得到 np.indices 需要两倍的时间。从源代码中很难说哪一个应该在什么条件下表现更好......有什么见解吗?
    • @DSM -- 谢谢。我实际上已经尝试过一段时间来解决这个问题,而我在上面发布的解决方案是我能想到的最好的解决方案。与numpy 的许多事情一样,很高兴看到有不同的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多