簡體   English   中英

關於在 np.where 語句中使用 np.logical_and 的問題

[英]question about using np.logical_and in an np.where statement

考慮 4 列數組 Q 的一個小樣本。我的目標是消除 Q 的行,其中BOTH 列 0 和 2 相等,並且列 1 和 3 相等 因此, [1, 2, 1, 2]需要去, [3, 4, 3, 4] 我認為以下代碼會起作用。

import numpy as np

Q = np.array([[1, 2, 1, 2],
              [1, 2, 1, 4],
              [2, 4, 3, 4],
              [3, 4, 3, 4],
              [4, 7, 2, 5]])

output = Q[np.where(np.logical_and(Q[:,0] != Q[:, 2], Q[:,1] != Q[:, 3]))]
print(output)

[[4 7 2 5]]

此代碼消除了所需的兩行,但也刪除了[1, 2, 1, 4][2, 4, 3, 4]

換句話說,它正在做:
如果 V[:,0] != V[:, 2] 刪除記錄,如果 V[:,1] != V[:, 3] 也刪除記錄”。

我希望它:“如果 BOTH V[:,0] != V[:, 2] AND V[:,1] != V[:, 3] ,則刪除記錄”。
這不是logical_and的意思嗎?

對我缺少的東西有什么見解嗎?

您所描述的所需輸出是:

output = Q[~((Q[:,0]==Q[:,2]) * (Q[:,1]==Q[:,3]))]

或同樣:

output = Q[~(np.logical_and(Q[:,0]==Q[:,2], Q[:,1]==Q[:,3]))]

或同樣:

output = Q[np.logical_or(Q[:,0]!=Q[:,2], Q[:,1]!=Q[:,3])]

或同樣:

output = Q[(Q[:,0]!=Q[:,2]) + (Q[:,1]!=Q[:,3])]

但我更喜歡這種方式(可能更快):

output = Q[(Q[:,0:2]!=Q[:,2:]).any(1)]

請注意,您不需要np.where 布爾掩碼適用於數組Q行。

輸出:

[[1 2 1 4]
 [2 4 3 4]
 [4 7 2 5]]

暫無
暫無

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

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