Я не понимаю, как работает индексирование numpy ndarray при использовании экземпляра пользовательского класса в качестве индекса.
У меня есть следующий код:
import numpy as np
class MyClass:
def __index__(self):
return 1,2
foo = np.array([[1,2,3],[4,5,6]])
bar = MyClass()
print(foo[1,2])
print(foo[bar])
Я ожидаю, чтополучить одинаковый результат (6) от обеих функций печати.Но из второго, где экземпляр класса используется в качестве индекса, я получаю сообщение об ошибке:
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
Если я вызываю метод __index__ явно с
print(foo[bar.__index__()])
, это работает.Но это противоречит цели магического метода.
Если я вызываю массив только с одним индексом, все работает отлично:
import numpy as np
class MyClass:
def __index__(self):
return 1
foo = np.array([[1,2,3],[4,5,6]])
bar = MyClass()
print(foo[1])
print(foo[bar])
>>> [4 5 6]
>>> [4 5 6]
Так что я не получаю:
- ndarray может использовать выходные данные метода __index__ для нескольких измерений.Видно при явном вызове.
- ndarray действительно сопоставляет метод __index__.Видно во втором примере.
- Но по какой-то причине это не работает одновременно.Почему?
Я что-то пропустил или ndarray не поддерживает такой вид индексации?
Я просто хочу добавить, что это, очевидно, не имеет значения,как метод __index__ выводит свой результат.Я пытался:
return a, b
return (a, b)
return tuple((a, b))
Ни один из них не работал для меня.