python - 根据列表中的某些元素从数组中选择行

时间:2018-03-31 14:05:32

标签: python arrays numpy dataset

我有一个带有值的二维数组,第一个元素表示该行后面的数据的ID。对于我的数组中的一行的Ex:[1,45,32,54],1是键,其余数字是与该键相关的值。在我的数组中,我有不同的键,编号从1-9开始,但我想创建第二个数组,其中包含带有ID的列表中的过滤值。

这是我使用的功能:

def filter_set(dataset, l):
    row=np.where(np.all(dataset[:,0] in l))

    filtered = np.take(dataset,row[0],axis=0)

    return filtered

这就是我所说的:

two_train_set = filter_set(train_set, [0, 1])

我收到了这个错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

如果有人能帮助我,我会非常感激,谢谢。

1 个答案:

答案 0 :(得分:1)

由于您的密钥只在1到9之间,我建议使用查找表:

>>> def filter_set(dataset, l):
...     mask = np.zeros((10,), dtype=bool)
...     mask[l] = True
...     return dataset[mask[dataset[:, 0]], :]
... 

演示:

>>> dataset = np.random.randint(0, 100, (10, 4))
>>> dataset[:, 0] = dataset[:, 0] % 9 + 1
>>> dataset
array([[ 6, 44, 93, 41],
       [ 6, 29, 81, 25],
       [ 6, 63, 65, 71],
       [ 8, 94, 79, 64],
       [ 8, 79, 52, 84],
       [ 8, 60, 94,  2],
       [ 3, 81, 55, 94],
       [ 1, 69, 45,  2],
       [ 8,  1,  9, 98],
       [ 9, 75, 26, 76]])
>>> filter_set(dataset, [5,6,1])
array([[ 6, 44, 93, 41],
       [ 6, 29, 81, 25],
       [ 6, 63, 65, 71],                                                                                            
       [ 1, 69, 45,  2]])

通过将in替换为np.in1d,您的原始方法也可以发挥作用。请注意,我还用高级索引替换了np.take - 我认为这是更现代的做同样事情的方式:

>> def filter_set_OP(dataset, l):
...     row = np.in1d(dataset[:, 0], l)
...     return dataset[row, :]
... 
>>> filter_set_OP(dataset, [5,6,1])
array([[ 6, 44, 93, 41],
       [ 6, 29, 81, 25],
       [ 6, 63, 65, 71],
       [ 1, 69, 45,  2]])