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
。