【问题标题】:Memberwise operator in pythonpython中的成员运算符
【发布时间】:2014-11-22 10:16:45
【问题描述】:

如何在 list(向量)上执行 Python 成员操作,例如在 Matlab/Octave 中。我的意思是,给出两个列表:

a = [1,2,3]
b = [4,5,6]

是否有成员运算符,例如:

c = a .* b = [1*4,2*5,3*6]
d = a ./ b = [1/4,2/5,3/6]

我知道我可以自己实现它,如果没有这个模块我会这样做。一种不完全防弹的方法可能是:

# Memberwise product:
def mwprod(a,b):
    c = []
    if len(a) == len(b):
        for a,b in zip(a,b):
            try:
                c.append(a*b)
            except:
                c.append(NaN)
    return c

正如user3426575 所说,这可以用一种非常pythonic 的方式进行压缩:

c = [ x*y for x, y in zip(a,b)  ]

无论如何,我想知道在list 上重载或实现此类运算符的更密集和美观的东西。

【问题讨论】:

  • 您正在寻找NumPy
  • 一个非常“pythonic”的方法是使用列表解析:c = [x * y for x, y in zip(a, b)]

标签: python matlab list vector octave


【解决方案1】:

这可以通过 numpy 来完成:

>>> import numpy as np
>>> a = np.array([1,2,3],float)  # float argument is used so that / operator does float division rather than integer division
>>> b = np.array([4,5,6],float)
>>> a*b
array([  4.,  10.,  18.])
>>> a/b
array([ 0.25,  0.4 ,  0.5 ])

【讨论】:

  • 感谢这个基于模块的回答。
【解决方案2】:

你可以这样试试,

>>> [ item * b[k] for k,item in enumerate(a)]
[4, 10, 18]
>>> [ item / b[k] for k,item in enumerate(a)]
[0.25, 0.4, 0.5]

【讨论】:

  • 感谢这个仅基于 python 的答案。
  • 这确实是一种奇怪且不正确的方法。这是不必要的O(N**2),如果列表包含重复项,则会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2012-01-23
  • 2012-02-05
相关资源
最近更新 更多