2009-02-10 57 views
53

现在我有vector3值表示为列表。有没有办法减去2这些像vector3值,如在Python中减去2个列表

[2,2,2] - [1,1,1] = [1,1,1] 

我应该使用元组?

如果它们中没有一个在这些类型上定义这些操作数,我可以定义它吗?

如果不是,我应该创建一个新的vector3类吗?

回答

96

如果这是你最终经常做的事情,并用不同的操作,您可能需要创建一个类来处理像这样的情况下,或更好地使用一些库,如Numpy

否则,寻找与zip内建函数使用list comprehensions

[a_i - b_i for a_i, b_i in zip(a, b)] 
+43

`[i - j for i,j in zip(a,b)]`更具可读性,并且不会用a和b中的项代替a和b。 – 2012-06-07 07:59:26

4

如果你有两个列表称为“A”和“B”,你可以这样做:[m - n for m,n in zip(a,b)]

8

时退房NumPy包蟒蛇。

+1

为什么不说`使用numpy数组`以免人们探索整个numpy包? – 2017-02-21 05:13:25

3

如果您计划执行的不仅仅是一个简单的内衬,最好是实施您自己的班级,并在适用于您的案例时重写相应的操作员。

Mathematics in Python摘自:

class Vector: 

    def __init__(self, data): 
    self.data = data 

    def __repr__(self): 
    return repr(self.data) 

    def __add__(self, other): 
    data = [] 
    for j in range(len(self.data)): 
     data.append(self.data[j] + other.data[j]) 
    return Vector(data) 

x = Vector([1, 2, 3])  
print x + x 
9

如果你的列表是a和b,你可以这样做:

map(int.__sub__, a, b) 

但你可能不应该。没有人会知道这意味着什么。

+0

这是很酷的答案。 – garej 2017-04-09 05:31:40

66

下面是列表推导的替代方案。 Map迭代遍历列表(后面的参数),同时进行,并将它们的元素作为参数传递给函数(第一个arg)。它返回结果列表。

map(operator.sub, a, b) 

此代码,因为有较少的语法(这对我来说更美观),显然它是长度为5的名单(见bobince的评论)提高了40%。不管怎样,这两种解决方案都可行

+0

我通常会看到在map()上重新列出的列表解析,尽管这可能只是因为它看起来更清晰的代码......不确定性能差异(如果有的话)。 – 2009-02-11 00:50:32

+2

在Py2.6中,对于五元素减法,映射()的出现速度快了近40%。理解更新,更清晰,避免使用lambda,但为了映射现有函数,map仍然可以......特别是在这里您可以利用内置zip。 – bobince 2009-02-11 01:07:33

+1

这是一个不错的答案,我真的很感激它! – user69453 2015-05-29 12:11:30

4

稍微不同的Vector类。

class Vector(object): 
    def __init__(self, *data): 
     self.data = data 
    def __repr__(self): 
     return repr(self.data) 
    def __add__(self, other): 
     return tuple((a+b for a,b in zip(self.data, other.data))) 
    def __sub__(self, other): 
     return tuple((a-b for a,b in zip(self.data, other.data))) 

Vector(1, 2, 3) - Vector(1, 1, 1) 
10

我不得不建议NumPy以及

它不仅是做矢量数学更快,但它也有一吨的便利功能。

如果你想要的东西,甚至更快的一维向量,尝试vop

它类似于MATLAB,但自由的东西。这里是你要做什么的一个例子

from numpy import matrix 
a = matrix((2,2,2)) 
b = matrix((1,1,1)) 
ret = a - b 
print ret 
>> [[1 1 1]] 

Boom。如果你想要的结果列表

list(array([1,2,3])-1) 
-1

试试这个。

0

list(numpy.array(list1)-numpy.array(list2)) 

如果不删除列表

1
import numpy as np 
a = [2,2,2] 
b = [1,1,1] 
np.subtract(a,b) 
0

对于曾经在Pycharm上编码的人,它也会复活其他人。

import operator 
Arr1=[1,2,3,45] 
Arr2=[3,4,56,78] 
print(list(map(operator.sub,Arr1,Arr2)))