Изменение поведения `__getitem__` и` __setitem__` в подклассе массива Numpy - PullRequest
0 голосов
/ 21 января 2019

Массивы Numpy могут быть эффективно разделены на подклассы , но я хочу изменить поведение __getitem__ и __setitem__, чтобы они могли принимать диапазон дат и времени, сохраняя при этом максимальное количество встроенной техники как операции, cumsum и т. д. Можно ли это сделать с помощью __array_ufunc__?

Похоже, что в их примере метод numpy.ufunc.at переопределен.

Может ли это использоваться для изменения поведения get / set для numpy массивов?

1 Ответ

0 голосов
/ 21 января 2019

Вы можете реализовать __getitem__ и __setitem__ для обработки ваших конкретных случаев (с объектами datetime) и отправки до super().__{get|set}item__ в других случаях. Таким образом, оставшаяся функциональность ndarray сохраняется. Например:

from datetime import date
import numpy as np

class A(np.ndarray):
    def __array_finalize__(self, obj):
        if obj is not None:
            obj.start_date = date.today()

    def __getitem__(self, item):
        if isinstance(item, slice) and isinstance(item.start, date) and isinstance(item.stop, date):
            return super().__getitem__(slice((item.start - self.start_date).days,
                                             (item.stop - self.start_date).days,
                                             item.step))
        return super().__getitem__(item)

a = A((10,), buffer=np.arange(10), dtype=int)
print(a[1:8])
print(a[date(2019, 1, 22):date(2019, 1, 29):2])
print(np.cumsum(a))
print(np.add.outer(a, a))

Какие выходы:

[1 2 3 4 5 6 7]
[1 3 5 7]
[ 0  1  3  6 10 15 21 28 36 45]
[[ 0  1  2  3  4  5  6  7  8  9]
 [ 1  2  3  4  5  6  7  8  9 10]
 [ 2  3  4  5  6  7  8  9 10 11]
 [ 3  4  5  6  7  8  9 10 11 12]
 [ 4  5  6  7  8  9 10 11 12 13]
 [ 5  6  7  8  9 10 11 12 13 14]
 [ 6  7  8  9 10 11 12 13 14 15]
 [ 7  8  9 10 11 12 13 14 15 16]
 [ 8  9 10 11 12 13 14 15 16 17]
 [ 9 10 11 12 13 14 15 16 17 18]]
...