转置实例“ T”如何在numpy数组中工作?

问题描述

我记得曾经写过一个类并定义了__init__方法时,我试图设置一个属于同一类的实例,如下例所示:

class Complex:
    def __init__(self,real,imag):
       self.real = real
       self.imag = imag
       self.conjugate = Complex(real,- imag) # instance of the same class

Compex(1,2) # RecursionError: maximum recursion depth exceeded

但是当我尝试代码时,我很快意识到我已经使__init__方法具有递归性。结果,它将创建一个无限循环,因此我为实例定义了一个方法。我将其作为一个课程,然后继续学习,直到找到这种在numpy中转置矩阵的方式:

A = np.array([
    [1,2],[3,4]
])

A.T # array([[1,3],[2,4]])

我的问题是,这如何不会像我之前的示例那样导致无限循环?

解决方法

这是定义类的正确方法,这恰好也是numpy定义转置的方式:

class Complex:
    def __init__(self,real,imag):
       self.real = real
       self.imag = imag

    @property
    def conjugate(self):
        return Complex(self.real,-self.imag)

通过将属性设为按需计算的property,可以避免递归错误。

数组的转置会创建一个新的数组对象,其形状和步幅都相反。数组数据不会被复制,因此操作非常便宜。