![](/img/trans.png)
[英]Unexpected behaviour in numpy np.where with 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.