假设你有下列数组

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调用的数量更少,因此我们每次调用都要做更多的工作。

07-24 09:45
查看更多