2016-12-31 113 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)]