Python 使用布尔数组的Numpy索引

Python 使用布尔数组的Numpy索引,python,numpy,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']] 如何做到这一点? 我将从以下内容开始:

我有以下数组,指示是否获取某个项目:

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']]
如何做到这一点?


我将从以下内容开始:

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
是一个内置函数,它将iterable对象作为参数,并为原始iterable中的所有元素返回元组(索引,元素)的iterable,因此
enumerate(行)
将返回(0[0,0,1])、(1[1,1,0])和(2[1,1,1,1])

对于i,如果val
将起作用,则枚举(行)中的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 ^

我将从以下内容开始:

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
是一个内置函数,它将iterable对象作为参数,并为原始iterable中的所有元素返回元组(索引,元素)的iterable,因此
enumerate(行)
将返回(0[0,0,1])、(1[1,1,0])和(2[1,1,1,1])

对于i,如果val
将起作用,则枚举(行)中的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 ^

您可以执行以下操作:

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']]

您可以执行以下操作:

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']]
我会这样做:

result=[]
对于测试_阵列中的阵列:
append([classes[i]for i,枚举(数组)中的值if value])
我会这样做:

result=[]
对于测试_阵列中的阵列:
append([classes[i]for i,枚举(数组)中的值if value])

在一行中,您可以执行以下操作:

print([[c代表zip中的(x,c)(l,class)如果x]代表test_数组中的l])

在一行中,您可以执行以下操作:

print([[c代表zip中的(x,c)(l,class)如果x]代表test_数组中的l])

这可以通过矩阵乘法实现:

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

这可以通过矩阵乘法实现:

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

到目前为止,我看到的答案从尴尬到令人困惑,坦白说,这里有一个简单的解决方案

导入np
arr=np.数组([[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()用于arr_bools中的行]

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

导入np
arr=np.数组([[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()用于arr_bools中的行]

您尝试过什么?我收回了我的复制标志,因为这个问题略有不同。我已经发布了我认为最地道、最直截了当的答案,请随意看看!你试过什么?我收回了我的复制标志,因为这个问题略有不同。我已经发布了我认为最地道、最直截了当的答案,请随意看看!
astype('O')
是什么意思?@DanielMesejo它转换成
对象
dtype
astype('O')
是什么意思?@DanielMesejo它转换成
对象
dtype