我正在寻找一种快速计算以下内容的方法:
import numpy as np
a = np.array([-1,1,2,-4,5.5,-0.1,0])
现在我想将 a 转换为一个二进制值数组,这样 a 的每个正项都为 1,否则为 0。所以我想要的结果是这样的:
array([ 0., 1., 1., 0., 1., 0., 0.])
实现这一目标的一种方法是
np.array([x if x >=0 else 0 for x in np.sign(a)])
array([ 0., 1., 1., 0., 1., 0., 0.])
但我希望有人能指出一个更快的解决方案。
%timeit np.array([x if x >=0 else 0 for x in np.sign(a)])
100000 loops, best of 3: 11.4 us per loop
编辑:从答案中找出最好的解决方案
%timeit (a > 0).astype(int)
100000 loops, best of 3: 3.47 us per loop
请您参考如下方法:
你可以使用掩码来做到这一点:
(a > 0).astype(int)
我不知道如何正确使用timeit,但即使
import numpy as np
from datetime import datetime
n = 50000000
a = np.random.rand(1, n).ravel()
startTime = datetime.now()
np.array([ x if x >=0 else 0 for x in np.sign(a)])
print datetime.now() - startTime
startTime = datetime.now()
(a > 0).astype(int)
print datetime.now() - startTime
pass
显示 26 秒 与 0.5 秒 的显着差异。
P.S. 根据您的评论
I'll be computing distances, like hamming
您实际上不需要整数数组,a > 0 就足够了。它将节省您的内存并使速度稍微快一些。
