假设你有下列数组
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))]
考虑到我想处理巨大的数组,这将是一个非常糟糕的解决方法。
有什么想法吗?
最佳答案
您只需使用:
b = a[np.all(a[:,:3] < 0,axis=1)]
所以你可以先用切片构造一个子矩阵,然后用
a[:,:3]
检查所有元素是否小于零。然后,我们将对每一行执行逻辑“与”(通过将列放在一起)。这将为每一行构造一个一维矩阵。如果三列都
< 0
,则元素将True
。否则就是True
。最后,我们使用掩蔽构造一个子矩阵,其中前三列都小于0。这可能会工作得更快,因为numpy调用的数量更少,因此我们每次调用都要做更多的工作。