如果存在特定值,则从偶数列中删除行

时间:2017-02-27 10:56:28

标签: python arrays numpy indexing

我有一个形状为

的numpy数组
(500,12) 

我想做的就是检查偶数列是否具有正值,例如。 value > 0。在这种情况下,我想删除数组中的整行。 我把它放了:

a = a[a[:,1] < 0, :]

这会消除所需的行,但会查看第二列。我希望它也检查第4列,第6列,第8列等。

有没有办法使用上面的方法呢?

5 个答案:

答案 0 :(得分:2)

如果您正在处理NumPy数组,那么您可以使用fancy indexing方法(使用整数数组序列索引数组),如下所示:

mask = (a[:, np.arange(1, a.shape[1], 2)] < 0).all(axis=1)
out = a[mask]

<强> 说明:

选择要比较其值的奇数列的位置:

np.arange(1, a.shape[1], 2)         # a.shape[1] gives the number of columns
# array([ 1,  3,  5,  7,  9, 11])

接下来,我们根据这些索引对数组进行子集化,并通过提供执行逐列检查的axis=1来查看这些列下的值是否小于零,并在删除后返回包含减少的行数的数组剩下的。

答案 1 :(得分:1)

虽然可能不是最有效的方法,但您可以对所有行使用 elementwise和 &

a = a[(a[:,1]<0)&(a[:,3]<0)&(a[:,5]<0)&(a[:,7]<0)&(a[:,9]<0)&(a[:,11]<0),:]

因此,您屏蔽了存在偶数列为正的所有项目。

使用functools.reduce

可以使效果更优雅(性能损失轻微)
from functools import reduce

a = a[reduce(lambda x,y:x&y,(a[:,i]<0 for i in range(1,12,2))),:]

如果事先未完全了解shape,您可以使用.shape[1]

from functools import reduce

a = a[reduce(lambda x,y:x&y,(a[:,i]<0 for i in range(1,a.shape[1],2))),:]

答案 2 :(得分:1)

一般方法是使用条件构建列表推导:

a = [row for row in a if all(row[j] <= 0 for j in range(0, len(row), 2))]

答案 3 :(得分:1)

如果你不想要一个循环(因为它会迭代地缩小你的数据帧并带来一些相关的开销):

Colocar

所以在一行中:

CookieManager cookieManager = new CookieManager() {
    protected int getPort(URL url) {

        // or deduct it from url.getProtocol()
        return 80;
    }  
};
webClient.setCookieManager(cookieManager);

答案 4 :(得分:0)

不使用循环,没有一个命令可以帮助您完成动机。我建议循环遍历所有行然后执行此操作。