我正在使用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
答案 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)
但这不是很漂亮......你知道strides
和flat
是如何工作的吗?