2013-10-07 18 views
4

根據文檔,ndarray.flat是在陣列上進行迭代的迭代而ndarray.ravel返回一個扁平陣列(如果可能)。所以我的問題是,我們應該什麼時候使用其中一個? 在下面的代碼中,哪一個會被優先考慮作爲賦值中的右值?numpy的拆紗與平在切片分配

import numpy as np 

x = np.arange(2).reshape((2,1,1)) 
y = np.arange(3).reshape((1,3,1)) 
z = np.arange(5).reshape((1,1,5)) 

mask = np.random.choice([True, False], size=(2,3,5)) 
# netCDF4 module wants this kind of boolean indexing: 
nc4slice = tuple(mask.any(axis=axis) for axis in ((1,2),(2,0),(0,1))) 
indices = np.ix_(*nc4slice) 

ncrds = 3 
npnts = (np.broadcast(*indices)).size 
points = np.empty((npnts, ncrds)) 
for i,crd in enumerate(np.broadcast_arrays(x,y,z)): 
    # Should we use ndarray.flat ... 
    points[:,i] = crd[indices].flat 
    # ... or ndarray.ravel(): 
    points[:,i] = crd[indices].ravel() 

回答

4

你也不需要。 crd[mask]已經是1-d。如果你沒有,numpy的總是調用np.asarray(rhs)第一,所以是否需要針對ravel沒有複製相同。當需要複製時,我猜想ravel目前可能會更快(我沒有時間)。

如果您知道可能需要一個副本,並且在這裏您知道什麼都不需要,重塑points實際上可能是最快的。既然你通常不需要最快的,我會說這是更多的口味的問題,並會親自可能使用ravel

+0

我更新了示例代碼,以提供更接近起源問題的實際情況下的示例。我不明白「asarray」這一行。我知道結果是一樣的。其實我的問題是,在使用'flat'和使用'ravel'時,numpy在上面的代碼中做了些什麼(幕後)? – joanpau

+0

這就是我說的,它會調用'np.asarray'(有效)幕後的右手邊,這意味着'arr.flat'被轉換爲一個數組反正。你使用哪一個仍然沒有關係。 – seberg

+0

好了,我的最後一個問題應該是:假設'asarray'方法不執行任何操作時,輸入已經是一個數組,這是什麼'asarray'當輸入是一個迭代器呢? [Documentation](http://docs.scipy.org/doc/numpy/reference/generated/numpy.asarray.html)沒有提到數組迭代器。 – joanpau