簡體   English   中英

根據兩列中的值刪除numpy數組的行

[英]Remove row of numpy array based on values from two columns

我有一個具有四列和多行的numpy數組:

>>> dat
array([['4/5/2004', '17', 0.0, 0.0],
   ['4/5/2004', '7', 0.0, 0.0],
   ['4/5/2004', '19:48:20', 58.432488, -135.9202205],
   ['4/5/2004', '19:48:32', 58.432524300000004, 0.0],
   ['4/5/2004', '19:48:36', 58.4325365, -150.9202813]], dtype=object)  

我想刪除第3列或第4列的值等於0的所有行,因此結果將是:

   ([['4/5/2004', '19:48:20', 58.432488, -135.9202205],
   ['4/5/2004', '19:48:36', 58.4325365, -150.9202813]])

我可以通過以下方法一次完成這一列:

a = dat[~(dat[:,2]==0), :]  

它返回第3列的值不等於0的行。我可以對多個列進行迭代處理,但是用一個命令完成所有操作將很方便。

我認為類似以下兩個示例的方法將起作用(但它們不起作用):

a = dat[~(dat[:,2]==0), :] or dat[~(dat[:,3]==0), :] 
a = dat[~(dat[:,2&3]==0), :]

希望我缺少一些簡單的語法,但在numpy幫助中找不到。

那么使用&

>>> dat[(dat[:,2] != 0) & (dat[:,3] != 0), :]
array([['4/5/2004', '19:48:20', 58.432488, -135.9202205],
       ['4/5/2004', '19:48:36', 58.4325365, -150.9202813]], dtype=object)

產生按元素的“和”。

我將其更改為!= 0因此&避免了~的附加反轉。

假設數據數組是2D ,我們可以切片並尋找有效的數組-

dat[~(dat[:,2:4]==0).any(1)]

或者,我們可以在!=0上使用np.all

dat[(dat[:,2:4]!=0).all(1)]

當感興趣的列不是連續的列時,我們需要使用那些列ID對其進行切片並使用相同的技術。 因此,假設要檢查的列ID存儲在名為colID的數組或列表中,那么我們將修改方法,如下所示-

dat[~(dat[:,colID]==0).any(1)]
dat[(dat[:,colID]!=0).all(1)]

因此,對於第3列和第4列的陳述情況,我們將具有: colID = [2,3]

您有使用or概念上正確的想法。 主要區別在於您要執行邏輯或( | )或邏輯與( & )(就像您使用邏輯而非( ~ )一樣)。

之所以可行,是因為dat[:,3] == 0會創建與dat列大小相同的數組或布爾值。 當此數組用作索引時, numpy會將其解釋為掩碼。 拆分遮罩數組以突出顯示此概念:

mask = (dat[:, 2] != 0) & (dat[:, 3] != 0)
dat = dat[mask, :]

計算掩碼的另一種方法如下:

mask = np.logical_and.reduce(dat[:, 2:] != 0, axis=1)

np.logical_and.reduce通過對行應用np.logical_and (處理&運算符的函數),將輸入數組縮小到列( axis=1 )上,因此在選定部分的所有元素都為True的情況下每行都是True。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM