我使用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)]
而没有不必要的计算或内存。
答案 0 :(得分: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返回数组而不是数组)