Python 如何合并2个numpy数组并连接它们的值?

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

有没有办法从这个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
# 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])