Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数值计算中numpy和OO的混合_Python_Performance_Oop_Numpy_Numerical - Fatal编程技术网

Python 数值计算中numpy和OO的混合

Python 数值计算中numpy和OO的混合,python,performance,oop,numpy,numerical,Python,Performance,Oop,Numpy,Numerical,首先,我想知道在数值计算中使用OO方法是否是一种良好的实践 其次,OO的一个可能用例是将某个模型的参数封装在某个对象中。我想研究形式为ax^2+bx+c的抛物线。所以我将a,b,c封装在抛物线物体中。我可以画它等等。现在,我想探索抛物线垂直轴的位置。基本上,在没有OO的情况下,我可以只绘制一个表面,比如说所有垂直轴位置的w.r.t.a和b(这将是两个numpy数组),对于一些给定的c值 我的问题是,如何在不牺牲(太多)numpy性能的情况下,使用额外的OO层进行曲面绘制 额外解释 使用OO方法的

首先,我想知道在数值计算中使用OO方法是否是一种良好的实践

其次,OO的一个可能用例是将某个模型的参数封装在某个对象中。我想研究形式为ax^2+bx+c的抛物线。所以我将a,b,c封装在抛物线物体中。我可以画它等等。现在,我想探索抛物线垂直轴的位置。基本上,在没有OO的情况下,我可以只绘制一个表面,比如说所有垂直轴位置的w.r.t.a和b(这将是两个numpy数组),对于一些给定的c值

我的问题是,如何在不牺牲(太多)numpy性能的情况下,使用额外的OO层进行曲面绘制

额外解释


使用OO方法的一种方法是为参数A和b的一系列值创建抛物线对象矩阵。但这种方法可能会处理非常大的对象,而不是参数范围的普通numpy数组。

您可以使用相同的数值算法,无论是否使用对象定向。我不太明白你的问题。OO更多的是关于程序结构和数据之间的连接。方法中的数值可以与正常程序中的数值相同。 --编辑--

当你们对抛物线的方法进行矢量化时,你们可以很快地制作出抛物线的数组。当然,您可以将更复杂的矢量化

import numpy as np

class parabola:
    a = 0.0
    b = 0.0
    c = 0.0
    def __init__(self,a,b,c):
        self.a = a
        self.b = b
        self.c = c
    def set_a(self, new_a):
        self.a = new_a
    def set_b(self, new_b):
        self.b = new_b
    def set_c(self, new_c):
        self.c = new_c
    def get_a(self):
        return self.a
    def get_b(self):
        return self.b
    def get_c(self):
        return self.c

vpara = np.vectorize(parabola)
vgeta = np.vectorize(parabola.get_a)
vgetb = np.vectorize(parabola.get_b)
vgetc = np.vectorize(parabola.get_c)


a = np.zeros(10000)
b = np.zeros(10000)
c = np.zeros(10000)
a[:]  = [i for i in xrange(10000)]
b[:]  = [2*i for i in xrange(10000)]
c[:]  = [i*i for i in xrange(10000)]

objs = np.empty((10000), dtype=object)
objs[:] = vpara(a,b,c)

print vgeta(objs[1:10:2]),vgetc(objs[9900:9820:-3])

我建议不要使用对象数组,因为使用numpy会失去几乎所有的性能优势。我们的结构或代码更像这样:

class Points:

    def __init__(self, x, y):
        self.x = np.asarray(x)
        self.y = np.asarray(y)

    def shift_left(self, distance):
        self.x -= distance

x = np.zeros(10000)
y = np.zeros(10000)

points_obj = Points(x, y)

现在,您可以创建在
points\u obj
上运行的函数、方法等,知道
points\u obj.x
point\u obj.y
是numpy数组(可能大小为1,也可能更大)。如果您需要能够索引到points_obj,您可以在类上定义一个
\uu getitem\uuu
方法。

我的意思是,如果我想在x和y上绘图,比如说,它们只是变量,不是模型的一部分,那就可以了。但是,当我想在模型参数上做大量工作时,我是否应该放弃模型部分的OO封装?即使这意味着要以一种程序化的方式重写整个内容?请看我的编辑,它可能会对您有所帮助。遗憾的是,numpy不允许使用真正面向数组的语言的语法,比如Fortran,在Fortran中,您只需编写
objs[556:824:-5].c
,就可以得到这些c`s的数组。如果有人知道怎么做,请告诉我。@greendiod,简而言之是的。请看下面我的答案。嗨,Bi Rico。您的方法的问题是,您将从一开始就使用numpy数组实现模型对象。在我提到的用例中,您首先需要一个简单的模型OO实现。然后你需要探索敏感性或者做其他静态分析