Python 如何合并2个numpy数组并连接它们的值?
有没有办法从这个Python数组合并中获得相同的结果:Python 如何合并2个numpy数组并连接它们的值?,python,arrays,numpy,optimization,Python,Arrays,Numpy,Optimization,有没有办法从这个Python数组合并中获得相同的结果: a = [1,2,3,4] b = [4,3,2,1] c = [ int(''.join (map (str, xs))) for xs in zip (a,b) ] c Out[4]: [14, 23, 32, 41] 但直接在Numpy阵列上操作: a Out[9]: array([1, 2, 3, 4]) b Out[10]: array([4, 3, 2, 1]) c = Your Answer c # desire
a = [1,2,3,4]
b = [4,3,2,1]
c = [ int(''.join (map (str, xs))) for xs in zip (a,b) ]
c
Out[4]: [14, 23, 32, 41]
但直接在Numpy阵列上操作:
a
Out[9]: array([1, 2, 3, 4])
b
Out[10]: array([4, 3, 2, 1])
c = Your Answer
c
# desired output: array([14, 23, 32, 41])
我的第一个(也是显而易见的)解决方案是:
c = np.array([int(''.join (map(str, xs))) for xs in zip(a.tolist(),b.tolist())])
c
Out[12]: array([14, 23, 32, 41])
但我想知道是否可以直接使用numpy数组来实现这一点,而不必将它们转换为python数组
注意:我使用1,2,3,4值进行简化,我希望有一个解决方案,在大小>10**4的两个数组上使用+双位数
更新了不同解决方案的时间安排: 验证结果:
我编写了一个函数,其中包含一个经过思考后发现的解决方案:
def merge(a,b):
#: I don't find a better way to create this array
nines = np.array([9,99,999,9999,99999,999999,9999999, 99999999])
#: get number of digits
exp = np.log10(a)+1
#: fix the zeros
exp[exp == -np.inf] = 1
#: fix the nines
exp[np.in1d(a,nines)] += 1
c = a * 10**exp.astype(int) + b
return c
它可能看起来过度思考,但比其他解决方案快得多:
%%timeit
c = merge(a,b)
10 loops, best of 3: 128 ms per loop
您可以使用
dtype
参数将numpy数组设置为string
数组,只需在其上使用numpy.char
中的自由函数add
将它们按字符串连接起来,如下所示
a = numpy.array([1,2,3,4], dtype=numpy.str)
b = numpy.array([4,3,2,1], dtype=numpy.str)
c = numpy.char.add(a, b).astype(int)
输出:
[14 23 32 41]
这里有一个使用NumPy数学函数的方法-
a*(10**(np.log10(b).astype(int)+1)) + b
样本运行-
In [32]: a
Out[32]: array([ 16, 2, 399, 4])
In [33]: b
Out[33]: array([ 4, 38, 2, 190])
In [34]: a*(10**(np.log10(b).astype(int)+1)) + b
Out[34]: array([ 164, 238, 3992, 4190])
查看numpy.char模块化
c=10*a+b
我已经检查了模块并找到了一个快速的答案。感谢Eelco。感谢Andrey的评论,但是当两个数组包含两位数时,该操作不会返回我想要的答案。可能是我的错,事实上,这并不意味着我也想要一个两位数的答案。谢谢你的答案,我只是在同一时间写了相同的解决方案^^^@Davidelaiglesia干杯,很高兴我能帮上忙。我想我找到了一个更快的解决方案^^^事实上,我不认为它更快。相当慢一倍。我会仔细检查你对timeit
的使用情况。啊,不,现在我看到你已经测试了1000万个元素。对于一个较小的例子(比如你在问题中的例子),我发布的解决方案的速度是原来的两倍。对于这个误导性的例子,我很抱歉,我试图简化这个情况,但我应该说明我使用的是哪种数组(大数组+两位数)。我更新了答案谢谢你。大约10分钟前,我发现了一种类似的方法。与您的一样,但支持0和仅由9组成的数字。@DavidLaiglesia您可以将此添加到问题中的计时测试中吗?谢谢
a*(10**(np.log10(b).astype(int)+1)) + b
In [32]: a
Out[32]: array([ 16, 2, 399, 4])
In [33]: b
Out[33]: array([ 4, 38, 2, 190])
In [34]: a*(10**(np.log10(b).astype(int)+1)) + b
Out[34]: array([ 164, 238, 3992, 4190])