5

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]不生成大型中间数组的等价物?

我意识到该解决方案对于 slice 来说是微不足道的[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)]没有不必要的计算或内存。

4

1 回答 1

1

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

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

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

于 2012-08-20T08:54:23.083 回答