使用布尔数组的Numpy索引

时间:2019-10-15 15:21:33

标签: python numpy

我有以下数组,用于指示是否要携带某项物品:

import numpy as np

test_array = np.array([[0, 0, 1],
                       [1, 1, 0],
                       [1, 1, 1]])

我要索引的数组就是这个:

classes = ['a', 'b', 'c']

这应该是结果:

[['c'], ['a', 'b'], ['a', 'b', 'c']]

这怎么办?

6 个答案:

答案 0 :(得分:1)


我将从这样的事情开始:

result = []
for row in test_array:
    partial_result = []
    for i in range(3):
        if row[i] == 1:
            partial_result.append(classes[i])
    result.append(partial_result)
print(result)

结果:

[['c'], ['a', 'b'], ['a', 'b', 'c']]

在Python中,我们更喜欢列表理解而不是循环,因此有时间进行改进:

print([[classes[i] for i, val in enumerate(row) if val] for row in test_array])

enumerate是一个内置函数,它将可迭代对象作为参数,并为原始可迭代对象中的所有元素返回元组(索引,元素)的可迭代性,因此enumerate(row)将返回(0 ,[0,0,1]),(1,[1,1,0])和(2,[1,1,1])。

for i, val in enumerate(row) if val将起作用,因为在Python中1s被解释为True,而0s被解释为False

[[classes[i] for i, val in enumerate(row) if val] for row in test_array]
^ create a list of elements based on some original list ------->^
 ^ each element of that list will be a list itself.
      ^ elements of that inner lists will be objects from classes list
              ^ for each pair (i, element) from enumerate(row) take this ith
                element, but just if val == 1 ^

答案 1 :(得分:1)

您可以执行以下操作:

import numpy as np

test_array = np.array([[0, 0, 1],
                       [1, 1, 0],
                       [1, 1, 1]])

classes = ['a', 'b', 'c']

lookup = dict(enumerate(classes))
result = [[lookup[i] for i, e in enumerate(arr) if e] for arr in test_array]
print(result)

输出

[['c'], ['a', 'b'], ['a', 'b', 'c']]

答案 2 :(得分:1)

我会这样做:

result = []
for array in test_array:
     result.append([classes[i] for i,value in enumerate(array ) if value ])

答案 3 :(得分:1)

您可以在一行中完成:

print ([[c for (x, c) in zip(l, classes) if x] for l in test_array])

答案 4 :(得分:1)

这可以通过矩阵乘法来完成:

[*map(list, test_array.astype('O')@classes)]
# [['c'], ['a', 'b'], ['a', 'b', 'c']]

答案 5 :(得分:1)

到目前为止,我所看到的答案从尴尬到坦率地说令人困惑,所以这是一个简单的解决方案。

import np

arr = np.array([[0, 0, 1], [1, 1, 0], [1, 1, 1]])

arr_bools = arr.astype(np.bool)

lookup_lst = np.array(['a', 'b', 'c'])

res = [lookup_lst[row].tolist() for row in arr_bools]