Python 从数组中选择大于模板的行

Python 从数组中选择大于模板的行,python,performance,numpy,Python,Performance,Numpy,现在我有一个浮点值的2D Numpy数组,即a,它的形状是(10^6,3)。 我想知道哪些行大于np.array([25.0,25.0,25.0])。然后输出满足此条件的行。 我的代码如下所示 # Create an empty array a_cut = np.empty(shape=(0, 3), dtype=float) minimum = np.array([25.0, 25.0, 25.0]) for i in range(len(a)): if a[i,:].all()

现在我有一个浮点值的2D Numpy数组,即
a
,它的形状是(10^6,3)。 我想知道哪些行大于
np.array([25.0,25.0,25.0])
。然后输出满足此条件的行。 我的代码如下所示

# Create an empty array
a_cut = np.empty(shape=(0, 3), dtype=float)

minimum = np.array([25.0, 25.0, 25.0])

for i in range(len(a)):
    if a[i,:].all() > minimum.all():
        a_cut = np.append(a_cut, a[i,:], axis=0)
然而,代码效率很低。几个小时后,结果还没有出来。
那么有没有办法提高这个循环的速度呢?

np.append
每次调用它时都会重新分配整个数组。它基本上与
np相同。concatenate
:非常谨慎地使用它。目标是批量执行整个操作

可以构造遮罩:

mask = (a > minimum).all(axis=1)
然后选择:

a_cut = a[mask, :]
使用索引而不是布尔掩码可能会略有改进:

a_cut = a[np.flatnonzero(mask), :]
索引数少于维度数的索引将索引应用于前导维度,因此您可以这样做

a_cut = a[mask]
因此,一个班轮是:

a_cut = a[(a > minimium).all(1)]

一行大于[25,25,25]意味着什么?那
a[i,:].all()>minimum.all()
看起来是错误的。它不应该是
a[i,:]>最小值吗?只需执行
a[(a>最小值)。全部(1)]
。除非必须,否则不要循环numpy数组;你只需要
(a>[25,25,25])。all(1)
@Alan我的意思是行中的所有元素都大于25。0@StephenWong
a[(a>minimum).all(1)]
。假设我有另一个名为
maximum=np.array([50.0,50.0,50.0])
,我想让
a
满足
maximum>a[I,:]>minimum
。如何修改代码?
max>a&a>min