python中有二进制OR运算符在数组上工作吗?

gus*_*y83 4 python operators

我来自matlab背景到python,我只是想知道python中是否有一个简单的运算符将执行以下功能:

a = [1, 0, 0, 1, 0, 0]
b = [0, 1, 0, 1, 0, 1]
c = a|b
print c
[1, 1, 0, 1, 0, 1]
Run Code Online (Sandbox Code Playgroud)

或者我必须写一个单独的功能来做到这一点?

Raz*_*erM 6

您可以使用列表理解.使用izipitertools如果你正在使用Python 2.

c = [x | y for x, y in zip(a, b)]
Run Code Online (Sandbox Code Playgroud)

或者,@ georg在注释中指出您可以导入按位或运算符并将其用于map.这只比列表理解略快.map不需要list()在Python 2中包装.

import operator
c = list(map(operator.or_, a, b))
Run Code Online (Sandbox Code Playgroud)

性能

列表理解:

$ python -m timeit -s "a = [1, 0, 0, 1, 0, 0]; b = [0, 1, 0, 1, 0, 1]" \
> "[x | y for x, y in zip(a, b)]"

1000000 loops, best of 3: 1.41 usec per loop
Run Code Online (Sandbox Code Playgroud)

地图:

$ python -m timeit -s "a = [1, 0, 0, 1, 0, 0]; b = [0, 1, 0, 1, 0, 1]; \
> from operator import or_" "list(map(or_, a, b))"
1000000 loops, best of 3: 1.31 usec per loop
Run Code Online (Sandbox Code Playgroud)

NumPy的

$ python -m timeit -s "import numpy; a = [1, 0, 0, 1, 0, 0]; \
> b = [0, 1, 0, 1, 0, 1]" "na = numpy.array(a); nb = numpy.array(b); na | nb"

100000 loops, best of 3: 6.07 usec per loop
Run Code Online (Sandbox Code Playgroud)

NumPy的(其中,ab已经被转化成numpy的阵列):

$ python -m timeit -s "import numpy; a = numpy.array([1, 0, 0, 1, 0, 0]); \
> b = numpy.array([0, 1, 0, 1, 0, 1])" "a | b"

1000000 loops, best of 3: 1.1 usec per loop
Run Code Online (Sandbox Code Playgroud)

结论:除非您需要NumPy进行其他操作,否则转换不值得.