代码之家  ›  专栏  ›  技术社区  ›  Gordon Wrigley

在numpy中,什么是take的多维等价物

  •  4
  • Gordon Wrigley  · 技术社区  · 14 年前

    def build_tree_base(blocks, x, y, z):
       indicies = [
            (x  ,z  ,y  ),
            (x  ,z+1,y  ),
            (x  ,z  ,y+1),
            (x  ,z+1,y+1),
            (x+1,z  ,y  ),
            (x+1,z+1,y  ),
            (x+1,z  ,y+1),
            (x+1,z+1,y+1),
        ]
        children = [blocks[i] for i in indicies]
        return Node(children=children)
    

    其中blocks是一个三维numpy数组。

    我想做的是用numpy.拿着然而,take似乎只处理一维索引。有没有像take这样的方法可以用于多维索引?

    我也知道你可以用转置,切片,然后再整形来完成,但那很慢,所以我在找一个更好的选择。

    2 回复  |  直到 14 年前
        1
  •  1
  •   denis    14 年前

    flat ?

    import numpy as np
    blocks = np.arange(2*3*4.).reshape((2,3,4))
    i,j,k = 0,1,2
    print [x for x in blocks[i:i+2, j:j+2, k:k+2].flat]
    

    ( 平的 是一个迭代器;像这样展开它,或者用 np.fromiter() ,

        2
  •  2
  •   Joe Kington    14 年前

    def build_tree_base(blocks, x, y, z):
        idx = [x, x, x, x, x+1, x+1, x+1, x+1]
        idz = [z, z+1, z, z+1, z, z+1, z, z+1]
        idy = [y, y, y+1, y+1, y, y, y+1, y+1]
        children = blocks[idx, idz, idy]
        return Node(children=children)
    

    编辑:我应该指出,这(或任何其他 "fancy" indexing )将返回一个副本,而不是原始数组中的视图。。。