Как убить numpy.ndarray - PullRequest
       10

Как убить numpy.ndarray

0 голосов
/ 19 мая 2019

Предыстория: в моей программе numpy.ndarrays используются для хранения разных вещей (полей, материалов, геометрий, параметров и т. Д.).Часто одно вычисляется из другого, и результат передается следующей функции.Если где-то в конвейере я забываю шаг, любые дальнейшие вычисления становятся бессмысленными, поэтому я хочу использовать более строгую проверку типов, чтобы избежать ошибок.

Я представил несколько новых типов, все из которых, по сути, простоновые имена для ndarray:

class Field(np.ndarray):
  pass

class Geometry(np.ndarray):
  pass

Теперь я могу удобно использовать isinstance, чтобы проверить, передан ли правильный тип функции.

Однако у меня возникают проблемы при создании этих объектов.Обычно они должны быть результатом некоторых простых операций, поэтому в конце функции я хотел бы привести np.ndarray к Field объекту.Однако простое написание Field(v) вызывает конструктор nparray, который терпит неудачу, поскольку v интерпретируется как форма, а не как данные.Кроме того, я не хочу создавать новый объект, я не хочу ничего копировать, я просто хочу изменить тип.Обычно это было бы плохой идеей, но в моем случае я знаю, что Field - это не что иное, как ndarray с другим именем, поэтому он должен работать.

Так что лучшеявного приведения ndarray к Field объекту?

Дополнительный вопрос: если я np.save и np.load мой объект подкласса, тип не сохраняется, и я читаю только ndarray.Есть ли рекомендуемая (эффективная) альтернатива?

1 Ответ

0 голосов
/ 19 мая 2019

Я только что узнал, что в тупой документации уже описан этот конкретный случай:

https://docs.scipy.org/doc/numpy-1.13.0/user/basics.subclassing.html

...