是否可以以i,j,k格式写入向量?

时间:2014-12-10 16:10:01

标签: python c python-internals

我知道可以做类似

的事情
i = numpy.array([1,0,0])
j = numpy.array([0,1,0])
k = numpy.array([0,0,1])

a = 2*i + 5*j + 9*k

但是是否可以利用类似于复杂数字方式的语法,并创建一个可以确定2i + 5j + 9k是我班级成员的类,并自动创建它?

或者是否需要通过改变解析文件的方式来改变python解释器?我已经查看了语法文件,但我所能看到的只是NUMBER,而j没有提到过一次。

我也查看了parsermodule.c,但是不能轻易发现任何明显可以做到的事情。

有谁知道这怎么可能?

我应该补充一点,我实际上并没有计划这样做(除非出现一些奇迹,事实证明它不需要重新编译我自己的python版本,除了学术之旅之外,这将是疯狂的事情),但只是出于对语言如何运作的好奇心。

1 个答案:

答案 0 :(得分:1)

您可以编写一个继承自numpy.ndarray(即子类)的类,该类重写 repr 方法(负责控制对象打印到控制台的方式),如下所示:

import numpy

class Vector3DDisplay(numpy.ndarray):

def __init__(self, vector):
    if len(vector) == 3:
        self.vec = numpy.array(vector)
    else:
        raise TypeError('Vector must be of length 3.')

def __repr__(self):
    return str(self.vec[0])+'*i + '+str(self.vec[1])+'*j + '+str(self.vec[2])+'*k '

你可能在这里注意到一个明显的问题:实际的向量是self.vec,而不是对象本身,所以你必须在self.vec属性上完成所有的numpy操作。这样做的原因是numpy数组的编写方式使它们难以子类化(c.f。this question about subclassing C exentsions)。通常,使用以下命令初始化数组:

>>>> import numpy
>>>> numpy.ndarray(vector)

问题是np.array实际上并不是一个类,而是numpy.ndarray类的工厂函数,它以不同的方式初始化,很少使用。你不能让一个对象从一个函数继承方法,所以继承并不简单。