Почему для индексации можно использовать переменные списка, но не буквальный список? - PullRequest
0 голосов
/ 08 мая 2020

В следующем коде у меня есть массив arr, который я хотел бы быстро закодировать для целых чисел 0-9. Я поместил этот массив в другой массив arrs, который будет содержать более одного массива (один массив используется для упрощения). Я хотел бы перебрать эти массивы (опять же, здесь есть только один) и выполнить горячую кодировку, как показано ниже. Для l oop работает нормально. Но я обнаружил, что если я попытаюсь использовать синтаксис внутри for l oop «вручную», я получу 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)

Ответы [ 2 ]

1 голос
/ 08 мая 2020

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]]
0 голосов
/ 08 мая 2020

x[y] эквивалентно x.__getitem__(y). Универсального запрета на использование списков в качестве индексов нет; это просто запрет list.__getitem__. Другие типы могут принять или отклонить то, что им нравится, в качестве индекса.

...