选择所有列上满足相同条件的行

时间:2014-10-08 19:08:18

标签: python numpy scipy

我有一个名为 d 的数据数组,其形状为(79000,17)。我想知道是否有一种方法可以编写一个短循环或一个函数来强制条件到所有列,只选择它们满足列上相同条件的行,例如,如果一个循环组合了列{{{ 1}},i

3 个答案:

答案 0 :(得分:1)

如果您想要一个支持所有条件(甚至您的条件)的灵活选择功能,您可以使用以下代码。根据需要实现my_filter()。

def select(list_of_rows, filter_function):
    result = []
    for row in list_of_rows:
        if filter_function(row):
            result.append(row)
    return result

def my_filter(row):
    if row[2] > 10:
        return True
    return False

my_list = [(1, 4, 7), (2, 9, 12), (4, 2, 20), (10, 20, 30), (3, 2, 1)]
result = select(my_list, my_filter)
print result

答案 1 :(得分:1)

根据您的回答判断,可以逐个检查条件 然后你可以跨列轴应用all缩减(即 查找所有列中的元素,列为axis=1的行, 是True

In [15]: arr = np.arange(25).reshape(5, 5); arr
Out[15]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

In [16]: ((arr > 7) & (arr < 17)).astype(int)
Out[16]: 
array([[ 0,  0,  0,  0,  0],
       [ 0,  0,  0,  1,  1],
       [ 1,  1,  1,  1,  1],
       [ 1,  1,  0,  0,  0],
       [ 0,  0,  0,  0,  0]], dtype=bool)

In [17]: ((arr > 7) & (arr < 17)).all(axis=1)
Out[17]: array([False, False,  True, False, False], dtype=bool)

如果条件确实是逐列功能,则可以使用 np.apply_along_axis按行轴axis=0切割数组,应用 该功能对所有切片然后使用相同的所有减少 输出:

In [38]: def between_multiples_of_2(x):
    return ((x % 2) == 0).cumsum() == 1
   ....: 

In [39]: np.apply_along_axis(between_multiples_of_2, axis=0, arr=arr).astype(int)
Out[39]: 
array([[1, 0, 1, 0, 1],
       [1, 1, 1, 1, 1],
       [0, 1, 0, 1, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

In [40]: np.apply_along_axis(between_multiples_of_2, axis=0, arr=arr).all(axis=1)
Out[40]: array([False,  True, False, False, False], dtype=bool)

答案 2 :(得分:0)

首先创建一个具有行数大小的Boolean数组,然后每次在循环中计算条件并将其与初始布尔数组相乘。

import numpy as np
bx=np.ones(d.shape[0], dtype=bool)

for i in range(d.shape[1]):
    bx*=((d[:,i]>17)*(d[:,i]<22.0))