Python3 / Numpy:ndarray条件索引

时间:2016-12-31 14:39:06

标签: python numpy

我来自MATLAB背景,我试图用python / numpy写这个:

[l, m, n] = ndgrid(1:size(dct, 1), 1:size(dct, 2), 1:size(dct, 3));
mycell{i, j} = dct(...
    min.^2 <= l.^2 + m.^2 + n.^2 & ...
    l.^2 + m.^2 + n.^2 <= max.^2)';

那么代码应该采用的是具有索引(例如x,y,z)的数组的所有值,其在minmax之间具有2范数,即min^2 < x^2 + y^2 + z^2 < max^2

我唯一能找到的是使用此索引处的数组值来索引数组的某些值,但是我想索引索引本身的条件。

我读到了有关广播和ix_功能以及高级索引的内容,但是我无法将这些内容整合在一起。

1 个答案:

答案 0 :(得分:5)

NumPy为我们提供了创建开放网格,可以在np.ogrid的帮助下替换3D网格。这实际上将取代MATLAB代码中的ndgrid部分,但具有额外的好处(请继续阅读以获取更多详细信息)。然后可以对这些网格进行平方并添加以执行相当于l.^2 + m.^2 + n.^2而不实际创建3D版本的lmn,就像我们使用的那样ndgrid。这是一个巨大的性能标准,并在this previous post中进行了探索,并且已经显示出性能优势。

因此,移植到NumPy,我们会 -

m,n,r = dct.shape    
x,y,z = np.ogrid[0:m,0:n,0:r]
vals = x**2+y**2+z**2
mycell[i][j] = dct[(min**2 <= vals) & (vals <= max**2)]