Numba - 如何从多维numpy数组中提取值

时间:2018-05-02 17:18:10

标签: python arrays numpy numba

我正在使用numba和numpy编写一个函数,在我的函数过程中,我将计算这两个项:idx,这是一个坐标列表(例如,{{1} })和idx = [3,4,5],一个3d numpy数组(例如,values将产生values.shape)。请注意,(100, 100, 100)的维度可以随意更改。

通常情况下,如果我执行values,它将返回一个数字,即指示坐标处的值。但是,如果我values[3,4,5],我会得到一个阵列!我知道这有效:values[idx],但这会在numba中引发错误:

values[tuple(idx)]

我无法让TypingError: cannot determine Numba type of <class 'type'> 成为一个元组,因为idx是在for循环中创建的,它将元素追加到idx,在循环之前定义为空列表

是否有一种简单的方法可以从给定列表的3d numpy数组中提取值,该列表具有每个维度中的坐标?这个看似简单的问题难以解决。

这是一个最低限度可复制的功能:

idx

1 个答案:

答案 0 :(得分:0)

由于没有人回答,我会发表评论作为答案:

values[idx[0], idx[1], idx[2]]有问题吗?对于较大的idx,这将是不切实际的,但似乎values.shape[0]是固定的并且等于3,所以这个基本解决方案看起来像是我的方式。

否则,我想到的解决方案是遍历dims并访问展平值视图的元素:

offset = 1
for d in range(values.ndim):
    offset *= idx[d] * values.strides[d]
element = values.flat[offset]

(如果你的dtype是float64,你还需要将步幅除以8) 但这不是很漂亮......你知道stridesflat是如何工作的吗?