在numpy中重载运算符

2024-10-19 16:36:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下问题:我希望创建和使用numpy数组,只需稍微改变操作符[]。到目前为止,我知道这是通过__getitem__(self, index)方法完成的。但是,我不知道如何做到这一点,所以我声明了一个数组,它在每个方面都是“numpyarray”,除了那一个问题(例如,为了示例起见,我希望array[i]被解释为array[i-1]

我试着用以下方法解决:

class myarray(np.ndarray):
def __getitem__(self, index):
    return self[index+1]

k = np.linspace(0, 10, 10).view(myarray)

虽然这不是真的有效


Tags: 方法selfnumpy声明示例indexdefnp
2条回答

多亏了onodip答案,我解决了我最初的问题。 这和我发布的稍有不同,我学会了以后更具体(不要以身试法)。在

我最初想在“循环”中迭代矩阵——使n+1索引指向0,等等——换句话说,考虑它们的模形状。在

import numpy as np


class myarray(np.ndarray):

def __getitem__(self, index): 

    if isinstance(index, tuple):
        new_index = tuple(index[i] % super(myarray, self).shape[i] for i in range(len(index)))
    else:
        new_index = index % super(myarray, self).shape[0]

    return super(myarray, self).__getitem__(new_index)


my_k = np.linspace(0, 10, 10).view(myarray)
print(my_k)
print(my_k[7])
print(my_k[17])

这对我来说是个很好的教训。感谢大家的回答和您的时间!在

你的代码有两个问题。第一,索引也可以是tuple(不仅仅是int)。 另一个是,在函数的返回中,您将使用[]获得项,它也使用getitem。这将导致无限递归。必须使用父类的函数与super()

import numpy as np


class myarray(np.ndarray):

    def __getitem__(self, index):
        if isinstance(index, tuple):
            index = index[0] + 1,
        else:
            index += 1
        return super(myarray, self).__getitem__(index)

my_k = np.linspace(0, 10, 10).view(myarray)
k = np.linspace(0, 10, 10).view(np.ndarray)
print(my_k)
print(k)

相关问题 更多 >