51 python tuples numpy python-2.7
什么是最优雅和简洁的方法(没有创建我自己的类与运算符重载)来执行Python 2.7中的元组算法?
可以说我有两个元组:
a = (10, 10)
b = (4, 4)
Run Code Online (Sandbox Code Playgroud)
我的预期结果是
c = a - b = (6, 6)
Run Code Online (Sandbox Code Playgroud)
我目前使用:
c = (a[0] - b[0], a[1] - b[1])
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
c = tuple([(i - j) for i in a for j in b])
Run Code Online (Sandbox Code Playgroud)
但结果是(6, 6, 6, 6)
.我相信上面的工作作为嵌套for循环导致4次迭代和结果中的4个值.
vro*_*del 64
如果你正在寻找快速,你可以使用numpy:
>>> import numpy
>>> numpy.subtract((10, 10), (4, 4))
array([6, 6])
Run Code Online (Sandbox Code Playgroud)
如果你想把它保存在一个元组中:
>>> tuple(numpy.subtract((10, 10), (4, 4)))
(6, 6)
Run Code Online (Sandbox Code Playgroud)
Jar*_*red 34
一种选择是,
>>> from operator import sub
>>> c = tuple(map(sub, a, b))
>>> c
(6, 6)
Run Code Online (Sandbox Code Playgroud)
并itertools.imap
可以作为替代品map
.
当然,你也可以使用其他功能,从operator
到add
,mul
,div
,等.
但我会认真考虑进入另一个数据结构,因为我不认为这种类型的问题适合tuple
s
Ash*_*ary 30
使用zip
和生成器表达式:
c = tuple(x-y for x, y in zip(a, b))
Run Code Online (Sandbox Code Playgroud)
演示:
>>> a = (10, 10)
>>> b = (4, 4)
>>> c = tuple(x-y for x, y in zip(a, b))
>>> c
(6, 6)
Run Code Online (Sandbox Code Playgroud)
使用itertools.izip
的内存有效的解决方案.
帮助zip
:
>>> print zip.__doc__
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
Return a list of tuples, where each tuple contains the i-th element
from each of the argument sequences. The returned list is truncated
in length to the length of the shortest argument sequence.
Run Code Online (Sandbox Code Playgroud)
小智 9
JFYI,100000 次迭代在我的笔记本电脑中的执行时间
np.subtract(a, b)
: 0.18578505516052246
tuple(x - y for x, y in zip(a, b))
: 0.09348797798156738
tuple(map(lambda x, y: x - y, a, b))
: 0.07900381088256836
from operator import sub tuple(map(sub, a, b))
: 0.044342041015625
运算符对我来说看起来更优雅。
即使lambda通常是不可取的,这也可以完全不用导入就很好地完成:
tuple(map(lambda x, y: x - y, a, b))
Run Code Online (Sandbox Code Playgroud)
如果要获取二维坐标平面上两个点之间的距离,则应使用线对减法的绝对值。
tuple(map(lambda x ,y: abs(x - y), a, b))
Run Code Online (Sandbox Code Playgroud)