индексирование numy ndarray методом __index__ - PullRequest
0 голосов
/ 16 марта 2019

Я не понимаю, как работает индексирование 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))

Ни один из них не работал для меня.

1 Ответ

1 голос
/ 16 марта 2019

Как уже упоминалось здесь , __index__ метод Must return an integer.

Вот почему ваша попытка не сработала, а пример с одним индексом сработал.

...