如何解决合适的数据类型可保存指向numpy ndarray元素的指针
对于python项目,我的任务是合并两个同事的工作并调用他们的函数。 要将问题分解为实质,请考虑以下情形:
同事A在其“ body_class.py”模块中计算对象的位置和速度值,如下所示:
class Body:
def __init__(self,x,y,z,vx,vy,vz):
self.x = x
self.y = y
self.z = z
self.vx = vx
self.vy = vy
self.vz = vz
对于他编程的其他功能,他希望保持代码尽可能的简洁,并使用各自的名称调用位置和速度矢量的组成部分。因此,他将它们保存为单独的变量。
同事B需要使用所有 Body 对象的位置和速度值来进行一些时间紧迫的计算,因此他决定使用numpy ndarrays来实现更快的矩阵计算。他期望工作的输入是一个二维numpy ndarray,其中包含所有 Body 对象的所有位置和速度分量(形式为三个 Body 对象的示例):
state = np.array([[2,3,-2,-3],#Body 1
[0,1,0],#Body 2
[0,5,2,4,2]]) #Body 3
是否可以将使用面向对象实例变量进行同事A的操作的代码清晰度与numpy进行同事B的计算的效率优势相结合? 我最初的想法是将包含所有对象的位置和速度信息的ndarray保存为 Body 类的类变量(以便同事B可以轻松访问此变量“状态”),类似于:
class Body:
states = np.empty([0,6])
def __init__(self,vz):
self.x = x
self.y = y
self.z = z
self.vx = vx
self.vy = vy
self.vz = vz
Body.states = np.concatenate((self.states,np.array([[self.x,self.y,self.z,self.vx,self.vy,self.vz]])),axis=0)
...然后为每个仅包含指向相应ndarray元素的指针/引用的Body对象创建一个实例变量(这样,同事A可以通过调用 self.x 从类内部,而不必不断更新此实例变量和相应的ndarray元素),但是我不知道是否可以在Python中实现,更不用说这是否是解决这种情况的好方法,或者最好的解决方案是只选择两种可能性之一(ndarray VS实例变量)
欢迎任何想法和建议!预先感谢您的帮助!
更新:
该项目是一个模拟,因此在模拟的每个时间步骤中都会执行上述两个操作,这使性能成为问题。 因此,我正在寻找一种解决方案,使其可以将所有Body对象的位置和速度值直接存储在一个大型2D数组中(这是同事B的必需输入),同时仍然可以通过其对象实例访问它们名称(例如b1.x)或其他更有意义的名称,而不必使用诸如state [3,2]之类的数组索引。
我要防止的是必须首先在其实例属性中为每个Body实例设置位置和速度值,然后必须在每个时间步中通过遍历所有Body来再次构造大型2D数组“状态”实例并将它们各自的位置和速度值堆叠在一起(据我所知,这对性能会非常不利,但是如果我错了,请纠正我)
解决方法
听起来像是命名元组的工作:
from collections import namedtuple
Body = namedtuple('Body',['x','y','z','vx','vy','vz'])
b1 = Body(2,3,-2,3)
# now it is possible to access attributes both by name...
b1.x # returns 2
# ... and as an array
np.array(b1) # array([ 2,3])
UPD:子类化和跟踪对象实例PoC
_Body = namedtuple('Body','vz'])
class Body(_Body):
instances = set()
def __new__(cls,*args,**kwargs):
body = super(Body,cls).__new__(cls,**kwargs)
Body.instances.add(body)
return body
def __del__(self):
Body.instances.remove(self)
def xy(self):
return self.x + self.y
@classmethod
def states(cls):
# will return a 2D numpy array of all Body instances
return np.array(list(cls.instances))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。