我有一个带有值的二维数组,第一个元素表示该行后面的数据的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()
如果有人能帮助我,我会非常感激,谢谢。
答案 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]])