2014-06-24 44 views
3

我有一個3D numpy數組。我想通過沿着一個軸在連續的2D切片上執行一個函數來形成一個新的3D數組,並且將結果切片堆疊在一起。顯然有很多方法可以做到這一點;我想盡可能以最簡潔的方式做到這一點。我認爲這將可能與numpy.vectorize,但這似乎產生一個函數,迭代我的數組中的每個值,而不是通過沿第一軸移動的2D切片。連續2D切片上的Numpy矢量化函數

基本上,我想要的代碼看起來是這樣的:

new3dmat = np.vectorize(func2dmat)(my3dmat) 

,並完成同樣的事情,這樣的:

new3dmat = np.empty_like(my3dmat) 
for i in range(my3dmat.shape[0]): 
    new3dmat[i] = func2dmat(my3dmat[i]) 

我怎樣才能做到這一點?

+0

你不能重寫你的'func2dmat'來操作整個3D陣列嗎? YMMV,但tHat通常是這種矢量化的最佳途徑。 – Jaime

+0

我可以這樣做,但循環解決方案更可取。我希望能夠對一個複合數據結構(3d矩陣)進行簡潔的操作,並使用一個可以對其成分(二維矩陣)進行操作的函數 - 而且這個函數不需要知道這些成分來自哪個大結構。這樣我只需要一個函數,而不是每個包含2d矩陣的可能結構的特殊函數。 –

+0

您需要一個GUFUNC,例如['np.linalg.det'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.det.html)......這個慣例是讓你的函數在每個2D上運行數組放在輸入的最後2個維上。如果你能寫出快速的矢量化代碼,那麼讓它在其他軸上工作只是明智地使用['np.rollaxis']的問題(http://docs.scipy.org/doc/numpy/reference/generated/ numpy.rollaxis.html)等。如果你想充分利用numpy,Python循環解決方案几乎不可取。 – Jaime

回答

3

我恐怕下面的東西是簡潔性和性能之間的最佳折衷。不幸的是,apply_along_axis不會佔用多個座標軸。

new3dmat = np.array([func2dmat(slice) for slice in my3dmat]) 

這不是額外撥款方面的理想等,但除非.shape [0]大相對於.size,額外的開銷應該是最小的。

+0

嗯,這看起來沒問題。我想知道,是否有辦法讓my3dmat中的slice沿着與第一個不同的軸進行迭代? –

+0

您可以使用np.rollaxis將所需的軸重複到前面 –