[英]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.