为什么可以使用列表变量进行索引,而不能使用文字列表



在下面的代码中,我有一个数组arr,我想对整数0-9进行一次热编码。我已经将这个数组放入另一个数组arrs中,该数组将容纳多个数组(一个用于简化事情的数组(。我想迭代这些数组(同样,这里只有一个(和一个热编码,如下所示。for循环运行良好。但我发现,如果我尝试"手动"在for循环中使用语法,我会得到一个TypeError:列表索引必须是整数或切片,而不是元组。引擎盖下面发生了什么事?我怀疑这是因为编译器的工作方式?

import numpy as np
arr = [0,1,4,7,9]
arrs = [arr]
results = np.zeros((len(arrs), 10))
print(results) # [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

for i, seq in enumerate(arrs):
print(i) # 0
print(seq) # [0, 1, 4, 7, 9]
results[i, seq] = 1
print(results) # [[1. 1. 0. 0. 1. 0. 0. 1. 0. 1.]]
#When I do the above "manually" I get a TypeError
results = [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
results[0,[0, 1, 4, 7, 9]] = 1
print(results)

NumPy具有特殊的索引,使其能够将序列解释为索引的第二个参数
您可以只使用numpy数组,但如果您想使用python列表:

import numpy as np
arr = [0,1,4,7,9]
arrs = [arr]
results = np.zeros((len(arrs), 10))
print(results) # [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

for i, seq in enumerate(arrs):
print(i) # 0
print(seq) # [0, 1, 4, 7, 9]
results[i, seq] = 1
print(results) # [[1. 1. 0. 0. 1. 0. 0. 1. 0. 1.]]
#When I do the above "manually" I get a TypeError
results = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
#this is taking place in numpy behind the scenes
nums = [0, 1, 4, 7, 9] #indices to update
for index in nums:
results[0][index] = 1
print(results) #[[1, 1, 0, 0, 1, 0, 0, 1, 0, 1]]

x[y]等价于x.__getitem__(y)。没有普遍禁止使用清单作为索引;这只是list.__getitem__的禁令。其他类型可以自由接受或拒绝他们喜欢的索引。

最新更新