2012-02-26 50 views
1

現在我有一個0和1的numpy數組,我想對每兩列執行logical_and。 for循環應該是這樣的:如何在numpy數組的每兩列執行一個操作?

import numpy as np 
result = [] 
data = [[0, 1, 1], 
     [1, 0, 1], 
     [1, 0, 1]] 
np_data = np.array(data) 
num_cols = len(np_data[1,:]) 
for i in range(0, num_cols): 
    for j in range(i+1, num_cols): 
     #Comparing every column with every other column 
     anded = np.logical_and(np_data[:,i], np_data[:,j]) 
     result.append(anded) 
print result 

我只是想知道是否有一個numpy的,田間的方式來做到這一點,因爲很明顯的循環是不利於對numpy的數組操作。

+0

這真的是你想要的'結果'的形式嗎?你將需要一些小代碼來找出i,j在結果中的位置。 – 2012-02-26 09:33:35

回答

1

你可以像這樣做,請注意,結果是你的結果的轉置(在這種情況下結果是一個二維數組,並在你的情況下,它是1darrays的列表)。

>>> from itertools import combinations 
>>> I, J = np.array(list(combinations([0,1,2], 2))).T 
>>> result = np.logical_and(np_data[:, I], np_data[:, J]) 
>>> result 
array([[False, False, True], 
     [False, True, False], 
     [False, True, False]], dtype=bool) 
>>> result.T 
array([[False, False, False], 
     [False, True, True], 
     [ True, False, False]], dtype=bool) 
+0

謝謝,這對我有用!我不知道你可以把列表作爲一個numpy數組的索引,非常有用,itertools也很棒! – joeschmidt45 2012-02-26 20:36:14

0

我敢肯定有構建索引列表II,JJ一個更聰明的方式,但這樣做的一樣你爲你的示例代碼:

import numpy as np 
data = [[0, 1, 1], 
     [1, 0, 1], 
     [1, 0, 1]] 
np_data = np.array(data) 
q=range(len(data)) 
ii,jj=zip(*[[i,j] for i in q for j in q if i<j]) 
result=np.transpose(np.logical_and(np_data[:,list(ii)],np_data[:,list(jj)])) 

編輯:爲ii,jj你也可以使用這個(靈感由巴戈):

ii,jj = np.array(list(combinations(q, 2))).T 
+0

哦,是的,Bago指出itertools組合是我正在尋找的,但我沒有時間去查找它。 – 2012-02-26 15:09:01

0

假設你有n行和m列的陣列(N,M),那麼就可以得到合乎邏輯的和所有可能的列之間爲陣列(M,M),其中每個元素是一個數組大小n。這與您的結果類似,但是尺寸加倍(無三角矩陣)。

import numpy as np 
data = np.array([[0, 1, 1], 
       [1, 0, 1], 
       [1, 0, 1]]) 
n,m = data.shape 
dist0 = np.tile(data.T,(m,1)).reshape(m,m,n) # repeat columns along axis 0 
dist1 = np.tile(data.T,(1,m)).reshape(m,m,n) # repeat columns along axis 1 
result = np.logical_and(dist0, dist1) 
# now result[i,j] contains the logical_and bewteen column i and j 
print(result[0,2]) 
[False True True] 
相關問題