numpy数组的动态高级索引
Posted
技术标签:
【中文标题】numpy数组的动态高级索引【英文标题】:Dynamic advanced indexing of numpy array 【发布时间】:2020-01-12 04:17:02 【问题描述】:我想实现一个函数,该函数可以计算大型数组(无法完全放入 RAM)上的基本数学运算。因此,我想创建一个函数,该函数将在选定的轴上逐块处理给定的操作。这个函数的主要思路是这样的:
def process_operation(inputs, output, operation):
shape = inputs[0].shape
for index in range(shape[axis]):
output[index,:] = inputs[0][index:] + inputs[1][index:]
但我希望能够通过对块进行切片/索引来更改轴。
是否可以以某种动态方式进行索引,而不是使用 ':' 语法糖?
我找到了一些帮助here,但到目前为止帮助不大:
谢谢
【问题讨论】:
您查看过numpy.memmap
的磁盘上/内存外阵列吗?
是的,但经过一番谷歌搜索后,我发现 h5py link 更有用。但是当我对它们执行像 np.add() 这样的基本数学运算时,它会将整个“数据集”加载到内存中。当我尝试将另一个数据集作为输出参数传递时-> 我得到 TypeError,我没有传递 Arraylike 对象。我有一堆数组,我需要处理一些基本数学运算和一些卷积 -> 并在计算块之间传递结果(执行运算)
@NilsWerner 到目前为止我会坚持使用 numpy.memmap 的建议。谢谢
【参考方案1】:
我认为你可以使用 python 的内置 slice
类型来实现你想要的。
在后台,方括号内使用的:
-表达式将转换为slice
的实例,但您也可以使用slice
开头。要遍历输入的不同轴,您可以使用正确长度的 slice
s 元组。
这可能看起来像:
def process_operation(inputs, output, axis=0):
shape = inputs[0].shape
for index in range(shape[axis]):
my_slice = (slice(None),) * axis + (index,)
output[my_slice] = inputs[0][my_slice] + inputs[1][my_slice]
我相信这应该适用于 h5py 数据集或内存映射数组,无需任何修改。
slice
和 __getitem__
的背景
slice
与__getitem__
一起使用以评估x[key]
语法。 x[key]
分两步评估:
-
如果
key
包含任何表达式,例如:
、i:j
或i:j:k
,那么这些将被去糖化为slice
实例。
key
被传递给对象x
的__getitem__
方法。该方法负责返回x[key]
的正确值
例如表达式:
x[2]
y[:, ::2]
等价于:
x.__getitem__(2)
y.__getitem__((slice(None), slice(None, None, 2)))
您可以探索如何使用如下类将值转换为切片:
class Sliceable:
def __getitem__(self, key):
print(key)
x = Sliceable()
x[::2] # prints "slice(None, None, 2)"
【讨论】:
以上是关于numpy数组的动态高级索引的主要内容,如果未能解决你的问题,请参考以下文章