2014-10-08 70 views
0

我有一组数据,称为d形状为(79000,17)。我想知道是否有一种方法来编写一个短循环或一个函数强制条件的所有列只选择列满足相同条件的行,例如,如果一个循环结合了列i的条件, d[:,i]<99选择在所有列上满足相同条件的行

回答

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 
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)) 
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) 
相关问题