我有以下数组,用于指示是否要携带某项物品:
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']]
这怎么办?
答案 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]