2013-08-23 25 views
2

我已經在3xN numpy數組上定義了操作,並且我想遍歷數組的每一列。我在做檢查列數numpy數組,返回1如果是一維數組

for i in range(nparray.shape[1]): 

但是,如果nparray.ndim == 1,則失敗。是否有一種乾淨的方法來確定numpy數組的列數,如果它是一個一維數組(如MATLAB的大小操作那樣返回1)。否則,我已經實現

if nparray.ndim == 1: 
    num_points = 1 
else: 
    num_points = nparray.shape[1] 

for i in range(num_points): 
+0

作爲一個側面說明,爲什麼要循環遍歷列索引而不是僅循環遍歷列? – abarnert

回答

3

如果你只是尋找一些更簡潔,你可以這樣做:

num_points = np.atleast_2d(nparray).shape[1] 

這將,當然,做一個新的臨時數組只是把它形狀,這是一個有點傻...但它會很便宜,因爲它只是一個相同的內存視圖。

不過,我覺得你的顯式代碼更易讀,但我可能會做一個try

try: 
    num_points = nparray.shape[1] 
except IndexError: 
    num_points = 1 

如果你反覆這樣做,不管你做什麼,你應該把它包在一個功能。例如:

def num_points(arr, axis): 
    try: 
     return arr.shape[axis] 
    except IndexError: 
     return 1 

然後你必須寫的是:

for i in range(num_points(nparray, 1)): 

當然,這意味着你可以通過編輯一個地方,例如,:

def num_points(arr, axis): 
    return nparray[:,...,np.newaxis].shape[1] 
2
無處不在改變的事情

如果你想保持一行,如何使用conditional expressions

for i in range(nparray.shape[1] if nparray.ndim > 1 else 1): 
    pass 
0

默認情況下,迭代一個np.array意味着遍歷行。如果你有遍歷列,只通過換位數組遍歷:

>>> a2=array(range(12)).reshape((3,4)) 
>>> for col in a2.T: 
    print col 

[0 4 8] 
[1 5 9] 
[ 2 6 10] 
[ 3 7 11] 

什麼是一個數組array([1,2,3])的預期的行爲,則視爲具有一列或具有3周的cols?這是混淆了你提到的陣列都是3XN陣列,這意味着這應該是預期的行爲,因爲它應該具有僅有1列進行處理:

>>> a1=array(range(3)) 
>>> for col in a1.reshape((3,-1)).T: 
print col 

[0 1 2] 

因此,一個通用的解決方案:for col in your_array.reshape((3,-1)).T: #do something