为了账号安全,请及时绑定邮箱和手机立即绑定

关于在 np.where 语句中使用 np.logical_and 的问题

关于在 np.where 语句中使用 np.logical_and 的问题

冉冉说 2023-06-20 14:21:43
考虑 4 列数组 Q 的一个小样本。我的目标是消除 Q 的行,其中BOTH columns 0 and 2 are equal, AND columns 1 and 3 are equal。所以,[1, 2, 1, 2]需要去,也一样[3, 4, 3, 4]。我认为下面的代码会起作用。import numpy as npQ = 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] 都删除记录”。这不是 logical_and 的意思吗?对我所缺少的有什么见解吗?
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您所描述的所需输出是:

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]]


查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号