我来自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)的数组的所有值,其在min
和max
之间具有2范数,即min^2 < x^2 + y^2 + z^2 < max^2
我唯一能找到的是使用此索引处的数组值来索引数组的某些值,但是我想索引索引本身的条件。
我读到了有关广播和ix_
功能以及高级索引的内容,但是我无法将这些内容整合在一起。
答案 0 :(得分:5)
NumPy为我们提供了创建开放网格,可以在np.ogrid
的帮助下替换3D网格。这实际上将取代MATLAB代码中的ndgrid
部分,但具有额外的好处(请继续阅读以获取更多详细信息)。然后可以对这些网格进行平方并添加以执行相当于l.^2 + m.^2 + n.^2
而不实际创建3D
版本的l
,m
和n
,就像我们使用的那样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)]