2016-04-19 15 views
0

当我使用numpy的,我可以简单地通过书面总结两个一维数组:如何用pythonic方式对对象列表的参数进行求和?

C = A + B 

如果我有对象的列表,并在列表中的所有对象都是同一类的,所有有三个参数(r,v和a)。如果我想计算可以说对列表中的所有对象说r = r + v +0.5*a: 如何知道我的所有对象都在一个列表L中,我会像在numpy中那样写一行?

像这样的东西我想:

L.r += L.v + 0.5*L.a 
+2

这(向量化)是在做关节炎时使用numpy而不是列表的主要原因之一。据我所知,你不能在没有调用for循环或列表理解的情况下在本地python中执行此操作。出于好奇,你为什么想在这种操作之外在numpy之外工作? –

+0

如果我在对象列表上使用numpy.asarray,我可以直接对numpy.array上的对象的参数进行矢量化处理吗?它告诉我AttributeError:'numpy。ndarray'对象没有属性'r' – Phaune

+0

@Phaune你需要做的是创建3个numpy数组,每个属性一个,执行向量化操作(效率会更高),然后将值设置在原始列表中的物体。 –

回答

1

如果你不能用两行生存:

[setattr(item,'r',item.r + item.v + 0.5 * item.a) for item in L] 
+0

但是在做这件事之前我真的会考虑@Adam Hughes的评论。 –

0

如果你可以用两行生存试试这个:

for item in L: 
    item.r += item.v + 0.5 * item.a 
2

这是有点不清楚你正在寻找的输出。你在寻找一个号码列表:

[x.r + x.v + .5*x.a for x in L] 

这些的总和?

sum([x.r + x.v + .5*x.a for x in L]) 

还是改变对象本身?

runningSum=0 
def mod(obj): 
    # How complicated this function is depends on what your trying to accomplish. 
    obj.r = runningSum + obj.r + obj.v + .5*obj.a 
    runningSum = obj.r 
    return obj 

map(mod,L) 
+0

我不认为这个问题陈述了期望的输出,提问者只是想复制一个numpy的功能。 –

1

虽然不是一个正式的答案,但我想挑起你的好奇心,让你想象一个由你的问题引发的可能世界。如果由于某种原因不想使用numpy,并且只想知道如何在一行中创建列表中所有元素的总和,则可能需要重新定义列表之间的操作。这可以通过定义像下面的一个非常简单的类来实现:

class array(): 
    def __init__(self, mylist): 
     self.list = mylist 
     return 
    def __add__(self, other): 
     for i in xrange(len(self.list)): 
      self.list[i] += other.list[i] 
     return array(self.list) 
    def __repr__(self): 
     return "%s" % (self.list) 

你可以看到这个类是使用Python列表实例,然后我定义了__add__方法,基本上表明如何阵列对象在+符号下进行交互。当然,这里有足够的空间来改进它并检查异常情况,但这只是为了强调您可以定义任何想要的事实。你可以看到添加两个数组对象返回一个新的数组对象,这允许我们继续添加。

只是给你看它是如何工作的,下面我写了一个很简单的例子:

A = array([1,2,3,4,5]) 
B = array([3,2,4,5,6]) 
C = A+B 

然后,如果你在提示符下键入C,你会看到

[4, 4, 7, 9, 11] 

再次是一个数组类。

相关问题