如何连接这两个numpy数组?

时间:2016-10-26 01:09:20

标签: python arrays python-3.x numpy

这是一个简单的操作,我在使用numpy时遇到了麻烦:

我有两个numpy数组:

import numpy as np
arr1 = np.array([12, 13, 14, 15])
arr2 = np.array([100, 200, 300, 400])

我想要四个不同的numpy数组:

a1 = np.array([12, 13, 14, 15, 100])
a2 = np.array([12, 13, 14, 15, 200])
a3 = np.array([12, 13, 14, 15, 300])
a4 = np.array([12, 13, 14, 15, 400])

什么是" numpythonic"要做到这一点的方法?

我可以使用numpy.tile重复第一个数组,例如

repeats = np.tile(arr1, len(arr2))

但那不是最佳的。

3 个答案:

答案 0 :(得分:2)

  

我想要四个不同的numpy数组:

您确定不想要一个阵列np.array([a1, a2, a3, a4])吗?

  

但那不是最佳的。

如果您关注最佳性,请以最少的副本预分配结果:

N = len(arr1)
M = len(arr2)
result = np.zeros((M, N + 1)
result[:,:N] = arr1
result[:,N] = arr2

如果你真的希望能够将这种东西写成表达式,你可以定义:

def build_arr(into, parts):
    for sl, val in parts.items():
        into[sl] = val
    return into

result = build_arr(np.zeros(M, N + 1), {
    np.s_[:,:N]: arr1,
    np.s_[:,N]:  arr2
})

答案 1 :(得分:1)

我会使用np.hstack和生成器表达式:

a1, a2, a3, a4 = (np.hstack((arr1, v)) for v in arr2)

如果arr2中有可变数量的元素,那么您可以将结果数组存储在列表中,而不是将它们解压缩为变量名称:

arrs = [np.hstack((arr1, v)) for v in arr2]

Dynamically creating variables几乎总是一个坏主意。如果你想要一个可变数量的名为数组,那么我建议你将它们存储在一个dict或其他一些名为Python的结构中。你可以使用词典理解:

named_arrs = {'a%i' % (i + 1): np.hstack((arr1, v)) for i, v in enumerate(arr2)}

答案 2 :(得分:1)

我更喜欢使用tile

In [1684]: np.tile(arr1,[arr2.shape[0],1])
Out[1684]: 
array([[12, 13, 14, 15],
       [12, 13, 14, 15],
       [12, 13, 14, 15],
       [12, 13, 14, 15]])
In [1685]: np.concatenate((np.tile(arr1,[arr2.shape[0],1]),arr2[:,None]),axis=1)
Out[1685]: 
array([[ 12,  13,  14,  15, 100],
       [ 12,  13,  14,  15, 200],
       [ 12,  13,  14,  15, 300],
       [ 12,  13,  14,  15, 400]])

这样的二维阵列本身很方便。但它可以拆分成数组:

In [1686]: np.split(_,arr2.shape[0])
Out[1686]: 
[array([[ 12,  13,  14,  15, 100]]),
 array([[ 12,  13,  14,  15, 200]]),
 array([[ 12,  13,  14,  15, 300]]),
 array([[ 12,  13,  14,  15, 400]])]

如果您确实需要这些数组的单独名称,请解压缩列表:

In [1687]: a1,a2,a3,a4=_
In [1688]: a1
Out[1688]: array([[ 12,  13,  14,  15, 100]])