索引到numpy的mgrid

时间:2012-08-20 00:45:28

标签: python numpy indexing

我使用numpy.mgrid生成“坐标索引数组”

y, x = np.mgrid[0:3, 0:2]
print x
array([[0, 1],
       [0, 1],
       [0, 1]])

在许多情况下,我会对这些数组进行一些切片(例如x[0, :])并丢弃其余数据。有时,这些切片比原始数组小得多,原始数组的计算成本很高(即np.mgrid[0:512, 0:512, 0:512])。 numpy是否提供了不生成大型中间数组的[coord[view] for coord in np.mgrid[0:512, 0:512, 0:512]等价物?

我意识到解决方案对于切片[0,:]来说是微不足道的,但我正在寻找一种处理索引numpy数组的任何有效方法的通用解决方案

修改

有些人要求提供view可能是什么样的具体示例。理想情况下,我希望有一个通用的解决方案来处理索引ndarray的任何有效方法。以下是上述3x2阵列的一些具体示例:

1)view = (1, slice(None, None, 2))

2)view = (np.array([0,1]), np.array([0, 1]))

3)view = np.array([[False, False], [False, True], [False, False]])

我正在寻找像

这样的功能
def mgrid_with_view(array_shape, view)
    ...

返回相当于[o[view] for o in np.indices(array_shape)]而没有不必要的计算或内存。

1 个答案:

答案 0 :(得分:1)

正如HYRY所说,我相信你要避免的是创建完整的数组。 mgrid创建一个完整的数组,但是如果您使用:

x, y = np.broadcast_arrays(*np.ogrid[0:2,0:3])

xy占用的内存不再是np.arange(0,2)(和np.arange(0,3)),同时就好像每个都是一个完整的数组。如果需要单个大型结果数组,则应该单独切片这些数组,然后将它们连接起来。 (np.broadcast_arrays返回数组而不是数组)