2015-02-17 85 views
0

Python中有一個非常大的二維數組,使用numpy庫。我想要有效地遍歷每一列,並且每次檢查元素是否與0不同以在每列中計算它們的數量。在Python中高效地遍歷numpy矩陣中的每一列

假設我有以下矩陣。

M = array([[1,2], [3,4]]) 

下面的代碼,使我們的每一行有效地行走,例如(這是不是我打算做當然!):

for row_idx, row in enumerate(M): 
    print "row_idx", row_idx, "row", row 
    for col_idx, element in enumerate(row): 
     print "col_idx", col_idx, "element", element 
     # update the matrix M: square each element 
     M[row_idx, col_idx] = element ** 2 

然而,在我來說,我想因爲我有一個非常大的矩陣,所以可以有效地遍歷每列。

我聽說有實現這個使用numpy的一個非常有效的方式,而不是我當前的代碼:提前

curr_col, curr_row = 0, 0 
while (curr_col < numb_colonnes): 
    result = 0 
    while (curr_row < numb_rows): 
     # If different from 0 
     if (M[curr_row][curr_col] != 0): 
      result += 1 
     curr_row += 1 
    .... using result value ... 
    curr_col += 1 
    curr_row = 0 

謝謝!

+0

您需要清洗縮進。 – hpaulj 2015-02-17 22:26:57

+0

重新您的第一個代碼塊,它可以由單個語句代替'M = M * M' – gboffi 2015-02-17 22:32:07

+0

縮進更正,謝謝 – Othmane 2015-02-17 22:44:12

回答

3

在您向我們展示的代碼中,您將numpy的數組視爲列表,並且您可以看到它的作用!但是數組不是列表,雖然你可以這樣對待它們,但使用數組,甚至是numpy都沒有意義。

要真正利用的numpy用處,你必須直接對數組操作,寫作,例如,

M = M*M 

當你想平方數組的元素,並使用豐富的numpy功能操作直接在陣列上。

這就是說,我會盡量讓您的問題更接近一些...... 如果您的目的是計算不同於零的數組元素,可以使用numpy函數sum

使用sum,可以獲得數組中所有元素的總和,也可以在特定軸上求和。

import numpy as np 
a = np.array(((3,4),(5,6))) 
print np.sum(a) # 18 
print np.sum(a, axis=0) # [8, 10] 
print np.sum(a, axis=1) # [7, 11] 

現在你抗議:我不想總結的元素,我想算非零元素......但

  1. ,如果你寫一個邏輯測試上數組,你獲得布爾值數組,例如,我們要測試其a元素甚至

    print a%2==0 
    # [[False True] 
    # [False True]] 
    
  2. False爲零,True是,在至少當我們總結它...

    print np.sum(a%2==0) # 2 
    

    或,如果你想總結一列,即,改變該指數是一整行

    print np.sum(a%2==0, axis=1) # [1 1] 
    

總結0個

print np.sum(a%2==0, axis=0) # [0 2] 

或總和,爲您的特定使用案例

by_col = np.sum(M!=0, axis=0) 
# use the counts of non-zero terms in each column, stored in an array 
... 

# if you need the grand total, use sum again 
total = np.sum(by_col) 
+0

謝謝!有用 – Othmane 2015-02-18 05:47:21