gpt4 book ai didi

python - 子类化 numpy ndarray 问题

转载 作者:太空狗 更新时间:2023-10-29 20:16:15 26 4
gpt4 key购买 nike

我想子类化 numpy ndarray。但是,我无法更改数组。为什么 self = ... 不改变数组?谢谢。

import numpy as np

class Data(np.ndarray):

def __new__(cls, inputarr):
obj = np.asarray(inputarr).view(cls)
return obj

def remove_some(self, t):
test_cols, test_vals = zip(*t)
test_cols = self[list(test_cols)]
test_vals = np.array(test_vals, test_cols.dtype)

self = self[test_cols != test_vals] # Is this part correct?

print len(self) # correct result

z = np.array([(1,2,3), (4,5,6), (7,8,9)],
dtype=[('a', int), ('b', int), ('c', int)])
d = Data(z)
d.remove_some([('a',4)])

print len(d) # output the same size as original. Why?

最佳答案

您没有得到预期结果的原因是您在方法 remove_some 中重新分配了 self。您只是在创建一个新的局部变量 self。如果你的数组形状没有改变,你可以简单地做 self[:] = ... 你可以保留对 self 的引用,一切都会很好,但你正在尝试改变形状 self 。这意味着我们需要重新分配一些新内存并更改我们引用 self 时指向的位置。

我不知道该怎么做。我认为可以通过 __array_finalize____array____array_wrap__ 来实现。但我尝试过的一切都达不到要求。

现在,还有另一种方法可以解决这个问题,它不会子类化 ndarray。您可以创建一个新类来保留一个 ndarray 属性,然后覆盖所有常用的 __add____mul__ 等。像这样:

Class Data(object):
def __init__(self, inarr):
self._array = np.array(inarr)
def remove_some(x):
self._array = self._array[x]
def __add__(self, other):
return np.add(self._array, other)

好了,你明白了。重写所有运算符很痛苦,但从长远来看,我认为更灵活。

你必须阅读 this彻底做对。像 __array_finalize__ 这样的方法需要在正确的时间调用以进行“清理”。

关于python - 子类化 numpy ndarray 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5149269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com