2016-12-31 81 views
2

我从MATLAB背景的,我想用Python写/ numpy的:Python3/numpy的:ndarray条件索引

[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_函数和高级索引,但是我不能将它们放在一起。

+0

@Divakar做编辑,使问题更加清晰。 – Xaser

+0

作为一种良好的做法,避免名称为'min','max'这些名称已经是builtin的名称将很好。 – Divakar

回答

5

NumPy的为我们提供了创建开放的网格,它可以取代的np.ogrid的帮助下,3D网格。这实际上将取代MATLAB代码中的ndgrid部分,但具有其他优点(请阅读以获取更多详细信息)。然后,这些网格可以平方和,而不实际创建3D版本lmn因为我们曾与ndgrid做执行l.^2 + m.^2 + n.^2相当。这是一个巨大的性能标准,并已在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)]