说你有以下数组
a = np.array([[-1,-2,-3,4],[6,-1,-3,-4],[3,2,5,6]])
并且您想要所有行,其中位置0,1和2是< 0.
到目前为止,我发现了以下不合理的解决方案:
b = a[np.logical_and(a[:, 0]<0, a[:, 1]<0, a[:, 2]<0)]
或
c= a[np.where((a[:, 0]<0) * (a[:, 1]<0) * (a[:, 2]<0))]
考虑到我想要处理大型数组,这将是一个非常糟糕的解决方法。
有什么想法吗?
答案 0 :(得分:4)
您可以简单地使用:
b = a[np.all(a[:,:3] < 0,axis=1)]
因此,您可以先使用切片构建子矩阵 a[:,:3]
将为矩阵a的前三列构建一个矩阵。接下来,我们使用< 0
来检查所有这些元素是否都小于零。
然后,我们将在每一行上执行逻辑和(通过将列组合在一起)。这将为每一行构建一维矩阵。如果所有三列都是True
,则元素将为True
。否则为False
。
最后我们使用 masking 来构建一个子矩阵,其中前三列 all 小于0.这可能会比号 numpy calls更少,因此我们每次通话都会做更多工作。