【问题标题】:Changing behavior of `__getitem__` and `__setitem__` in Numpy array subclass在 Numpy 数组子类中改变 `__getitem__` 和 `__setitem__` 的行为
【发布时间】:2019-01-21 18:09:49
【问题描述】:

Numpy arrays can be efficiently subclassed,但我想修改__getitem____setitem__ 的行为,以便它们可以采用日期时间范围,同时保留最大数量的内置机制,如操作、cumsum 等。可以这样吗用__array_ufunc__完成?

似乎在他们的example 中,numpy.ufunc.at 方法被覆盖了。

这可以用来修改 numpy 数组的 get/set 行为吗?

【问题讨论】:

  • 那么你应该完全实现 __getitem____setitem__ 你想要覆盖那些。
  • @a_guest 我想保留像 cumsumadd 等 ufunc 的功能,因为它们会在普通数组中运行,只需使用这种新的索引方法即可。这可以通过简单地覆盖__getitem____setitem__ 来实现吗?

标签: python arrays numpy getter-setter


【解决方案1】:

您可以实现__getitem____setitem__ 来处理您的特定情况(使用日期时间对象),并在其他情况下分派给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]]

【讨论】:

  • 广播可以被覆盖吗?我希望能够一起广播不同大小的数组,以便通过插值对一个分辨率较低的时间序列进行上采样,然后进行广播。
猜你喜欢
  • 2011-07-24
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2018-12-20
  • 2015-09-25
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多