索引到numpy的mgrid

Chr*_*isB 5 python indexing numpy

numpy.mgrid用来生成"坐标索引数组"

y, x = np.mgrid[0:3, 0:2]
print x
array([[0, 1],
       [0, 1],
       [0, 1]])
Run Code Online (Sandbox Code Playgroud)

在许多情况下,我会对这些数组进行一些切片(例如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)
    ...
Run Code Online (Sandbox Code Playgroud)

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

seb*_*erg 1

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

x, y = np.broadcast_arrays(*np.ogrid[0:2,0:3])
Run Code Online (Sandbox Code Playgroud)

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