2010-10-06 165 views
49

刪除行我有一個數組看起來像這樣的:在numpy的陣列

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]] 

注意,行已在最後一個零值。我想刪除包含零的任何行,同時保留所有單元格中包含非零值的行。

但是每次填充時數組都會有不同數量的行,並且每次都將位於不同的行中。

我得到每行中非零元素與下面的代碼行的數目:

NumNonzeroElementsInRows = (ANOVAInputMatrixValuesArray != 0).sum(1) 

對於上面的陣列,NumNonzeroElementsInRows包括:[5 4]

五個表明第0行中的所有可能值都是非零值,而第4行則表示第1行中的一個可能值爲零。

因此,我試圖使用以下幾行代碼來查找和刪除包含零值的行。

for q in range(len(NumNonzeroElementsInRows)): 
    if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max(): 
     p.delete(ANOVAInputMatrixValuesArray, q, axis=0) 

但由於某些原因,該代碼似乎並沒有做任何事情,即使做了很多打印命令表明所有的變量似乎是正確的填充導致該代碼。

必須有一些簡單的方法來簡單地「刪除任何包含零值的行」。

任何人都可以告訴我要寫什麼代碼來完成這個任務嗎?

回答

4

這與您的原始方法類似,並會使用比unutbu's answer更少的空間,但我懷疑它會變慢。

>>> import numpy as np 
>>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]]) 
>>> p 
array([[ 1.5, 0. ], 
     [ 1.4, 1.5], 
     [ 1.6, 0. ], 
     [ 1.7, 1.8]]) 
>>> nz = (p == 0).sum(1) 
>>> q = p[nz == 0, :] 
>>> q 
array([[ 1.4, 1.5], 
     [ 1.7, 1.8]]) 

順便說一句,你的行p.delete()不爲我工作 - ndarray都不具備的一個.delete屬性。

+8

簡單一點:對[〜(P == 0).ANY(1)]或行更加明確:P [〜(P == 0).ANY(1),:] – user333700 2010-10-07 01:19:52

+0

@ user333700 - 這應該是一個答案 - 你一定會得到我的投票!在這種使用中,'any'比'sum'更清晰。 – mtrw 2010-10-07 01:26:31

12

這裏有一個襯墊(是的,它類似於user333700的,卻多了幾分直白):

>>> import numpy as np 
>>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], 
       [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]) 
>>> print arr[arr.all(1)] 
array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875 , 0.53172222]]) 

順便說一句,這種方法是很多的,比大矩陣蒙面陣列方法更快。對於2048 x 5的矩陣,這種方法快了大約1000倍。

順便說一句,user333700的方法(來自他的評論)在我的測試中稍微快了一點,儘管它令我難以置信的原因爲什麼。

+3

「任何」可能會短路,只要檢測到第一個真實情況,它就可以停止,而「全部」必須檢查所有條件。所以,不是(在numpy中是「〜」),一般來說應該比所有的都快。 – user333700 2010-10-11 02:23:16

+3

@ user333700,它們都可以短路,只是爲了不同的事情。在檢測到的第一個真實情況下,任何短路都爲真;在檢測到的第一個錯誤情況下,「全部」短路爲假。在這種情況下,短路應該是平局,但是在我看來,做多餘的不應該讓它慢下來。 – 2010-10-11 02:28:58

2

numpy提供了一個簡單的函數來完成同樣的事情: 假設你有一個被屏蔽的數組'a',調用numpy.ma.compress_rows(a)將刪除包含被屏蔽值的行。 我想這是更快的方式...

96

從數組中刪除行和列的最簡單方法是numpy.delete方法。

假設我有以下數組x

x = array([[1,2,3], 
     [4,5,6], 
     [7,8,9]]) 

要刪除的第一行,這樣做:

x = numpy.delete(x, (0), axis=0) 

要刪除第三列,這樣做:

x = numpy.delete(x,(2), axis=1) 

所以你可以找到其中有0的行的索引,把它們放在一個列表或元組中並將其作爲函數的第二個參數傳遞。

+0

謝謝!我有同樣的問題,我不明白爲什麼簡單地調用'numpy.delete(x,index)'不起作用。 – Antimony 2015-11-20 22:59:22

+3

請注意,[numpy delete()文檔](https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html)指出「通常最好使用布爾掩碼」,因爲返回一個新數組 - 在該鏈接下提供一個示例 – arturomp 2016-10-27 03:42:07

0

我可能爲時太晚回答這個問題,但想分享我的意見,以利於社區。對於這個例子,讓我打電話給你的矩陣'ANOVA',我假設你只是試圖從這個矩陣中刪除行,只在第5列中使用0。

indx = [] 
for i in range(len(ANOVA)): 
    if int(ANOVA[i,4]) == int(0): 
     indx.append(i) 

ANOVA = [x for x in ANOVA if not x in indx]