Python 关于在np.where语句中使用np.logical_和的问题
考虑4列数组Q的一个小示例。我的目标是消除Q行,其中列0和2相等,列1和3相等。所以,Python 关于在np.where语句中使用np.logical_和的问题,python,arrays,numpy,Python,Arrays,Numpy,考虑4列数组Q的一个小示例。我的目标是消除Q行,其中列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]]) outpu
[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]也删除记录。” 我希望它: “如果V[:,0]!=V[:,2]和V[:,1]!=V[:,3]”
这不就是逻辑和逻辑的意思吗
对我缺少的东西有什么见解吗?您所描述的理想输出是:
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[~(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[~(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])]
但我更喜欢这种方式(可能更快):
请注意,您不需要np.where
。布尔掩码应用于数组Q
的行
输出:
[[1 2 1 4]
[2 4 3 4]
[4 7 2 5]]
@用户109387不客气。我个人更喜欢
output=Q[(Q[:,0:2]!=Q[:,2:)。任何(1)]
,但这也取决于这个简化问题如何应用于您的特定问题。在答案中也添加了这一点。