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 开头。要遍历输入的不同轴,您可以使用正确长度的 slices 元组。

这可能看起来像:

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:ji: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数组的动态高级索引的主要内容,如果未能解决你的问题,请参考以下文章

Python的numpy高级应用!

数据分析之道-NumPynumpy切片与索引

Numpy库的学习

11-2 numpy/pandas/matplotlib模块

(数据分析三板斧)第一斧Numpy-第三节:索引和切片

NumPy 数组切片索引