2017-02-27 35 views
3

我與形狀從偶數列刪除行,如果某些值存在

(500,12) 

所有我想要做的是檢查偶數列是否具有正值,例如numpy的陣列。 value > 0。在這種情況下,我想刪除我的數組中的整個行。 我把這個了:

a = a[a[:,1] < 0, :] 

這消除了需要的行,但看起來在第二列。我希望它檢查第4列第6列第8列等。

有沒有使用我的方法做到這一點的方法?

+0

不應該檢查是' <='? –

+0

不清楚你定義的是哪些列和哪些行。你說「在這種情況下,我想刪除我的陣列中的整個行」,你的意思是整個專欄?你可能會考慮使用熊貓。 – Elmex80s

+0

我的主陣列有500行和12列。然後我想要檢查每個偶數列是否包含正值。如果是這樣,該行應該從我的主數組中刪除,然後變成12行的499行。 –

回答

1

雖然也許不是最有效的方式,你可以使用的elementwise和&所有行:

a = a[(a[:,1]<0)&(a[:,3]<0)&(a[:,5]<0)&(a[:,7]<0)&(a[:,9]<0)&(a[:,11]<0),:]

所以你屏蔽掉了其中存在偶數列,它是積極的所有項目。

您可以通過使用functools.reduce使其更加優雅(與未成年人的性能損失):

from functools import reduce 

a = a[reduce(lambda x,y:x&y,(a[:,i]<0 for i in range(1,12,2))),:]

萬一shape事先不完全清楚,你可以使用.shape[1]

+0

我可以但事情是我會有更多的列。所以即時尋求一個通用的解決方案。我實際上把它,它看起來像它的工作: 我在範圍內(1,12,2): a = a [a [:,i] <0,:] 你能看到這個問題嗎? –

+0

@MatiMalik:我認爲編輯越過了你的評論。在語義上它是等價的。但我的猜測是,你會付出更高的性能損失,因爲你每次在進場時都會過濾陣列。 –

+0

您的更新解決方案可能更簡化,謝謝!你也有建議,現在如何在偶數列中將所有負值轉換爲正值? –

0

沒有使用循環,沒有單一的命令可以幫助你動員自己。我建議循環所有的行,然後做這個。

1

比較通用的做法是建立一個列表理解與條件:

a = [row for row in a if all(row[j] <= 0 for j in range(0, len(row), 2))] 
2

如果你正在處理NumPy的陣列,那麼你可以使用fancy indexing辦法(索引與整數數組序列的陣列)作爲所示:

mask = (a[:, np.arange(1, a.shape[1], 2)] < 0).all(axis=1) 
out = a[mask] 

說明:

要選擇其值要被比較奇數列的位置:

np.arange(1, a.shape[1], 2)   # a.shape[1] gives the number of columns 
# array([ 1, 3, 5, 7, 9, 11]) 

接下來我們子集中的陣列基於這些指數,看看這些列下的值都大於零較小通過提供axis=1其執行列檢查並在刪除剩餘部分後返回包含減少行數的數組。

1

如果你不想要一個循環(因爲它反覆收縮你的數據框與一些相關的開銷):

m = (arr > 0) # check if positive; this is what you want to keep 
m = arr.ix[:,1::2] # select only the even columns 
m = arr.any(axis=1) # and check if any of them is true 

所以在一條線:

arr[(arr > 0)[:,1::2].all(axis=1),:] 
+0

它不應該是'all'而不是'any'嗎? –

+0

不完全確定,但評論似乎表明。改變了它。 – Roelant