Фиксировать список как координаты для многомерного массива - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу зафиксировать список в виде набора координат для моего многомерного массива Numpy без ввода каждой отдельной координаты. Я знаю, что это возможно для кортежей. Почему не для списка?

import numpy as np

qn=np.random.choice(list(range(100)), 64).reshape(4, 4, 4)

NS=[1,0,0]

print(qn[1,0,0])
#7
print(qn[NS])
#7   #Would be what I've been looking for

#I also tried
print(qn[iter(NS)])

1 Ответ

0 голосов
/ 17 сентября 2018

Если я правильно понял (т.е. вы хотите получить один элемент из qn программно), все, что вам нужно сделать, это использовать tuple вместо list.Обратите внимание, что нарезка и описание списка, хотя они используют одинаковые квадратные скобки [ и ], выполняют совершенно разные операции:

  • item[1] обращается к части объекта (в зависимости отфактический объект).
  • [1, 2] создает список с указанными в нем элементами.

Следовательно, в вашем примере NS не может использоваться вместо 1, 0, 0(что является tuple), но явно убедившись, что NS - это tuple (в конечном итоге с тем же содержимым, что и раньше), к уловке.

import numpy as np

np.random.seed(0)

# FYI, no need to "cast" `range()` to `list`
qn = np.random.choice(range(100), 64).reshape(4, 4, 4)

NS = 1, 0, 0
# equivalent to: `NS = (1, 0, 0)`
# equivalent to: `NS = tuple(1, 0, 0)`
# equivalent to: `NS = tuple([1, 0, 0])` (this is doing a bit more, but the result is equivalent)
# this is different from: `NS = [1, 0, 0]`

print(qn[NS])
# 39

Если NSсгенерируйте другим способом как list, все, что вам нужно сделать, это заранее преобразовать в tuple.

NS = [1, 0, 0]
print(qn[tuple(NS)])

Это часть сложной системы индексации NumPy .

...