首页 > 解决方案 > numpy 数组的动态高级索引

问题描述

我想实现一个可以计算大型数组(不完全适合 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:]

但我希望能够通过对块进行切片/索引来更改轴。

是否可以不使用“:”语法糖以某种动态方式进行索引?

我在这里找到了一些帮助,但到目前为止并没有太大帮助:

谢谢

标签: pythonnumpy

解决方案


slice我认为你可以使用 python 的内置类型来实现你想要的。

:幕后,方括号内使用的 - 表达式将转换为 的实例slice,但您也可以使用 aslice开头。要遍历输入的不同轴,您可以使用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]分两步评估:

  1. Ifkey包含任何表达式,例如:,i:j或者i:j:k然后将这些表达式去糖化为slice实例。
  2. key被传递给__getitem__对象的方法x。该方法负责返回正确的值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)"

推荐阅读