如何重复连接numpy数组?

时间:2018-02-27 17:25:33

标签: python numpy

我试图看看是否可以将具有固定大小的空数组连接到具有相同大小的其他数组:

import numpy as np

final_array = np.empty([3, 5])
>>>final_array
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

array_1 = np.array([1, 1, 1])
final_array = np.concatenate([final_array, array_1])
>>>final_array
array([[ 1,  1,  1],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

array_2 = np.array([2, 2, 2])
final_array = np.concatenate([final_array, array_2])
>>>final_array
array([[ 1,  1,  1],
       [ 2,  2,  2],
       [ 0.,  0.,  0.]])

array_3 = np.array([3, 3, 3])
final_array = np.concatenate([final_array, array_3])
>>>final_array
array([[ 1,  1,  1],
       [ 2,  2,  2],
       [ 3,  3,  3]])

所以我希望以顺序方式将final_arrayarray_1array_2array_3连接起来。我怎么做到这一点?

非常感谢!

2 个答案:

答案 0 :(得分:2)

np.vstack可能足以满足您的目的:

array_1 = np.array([1, 1, 1])
array_2 = np.array([2, 2, 2])
array_3 = np.array([3, 3, 3])

lst = [array_1, array_2, array_3]

np.vstack(lst)

# array([[1, 1, 1],
#        [2, 2, 2],
#        [3, 3, 3]])

另一种选择是itertools.chain

from itertools import chain

np.fromiter(chain(*lst), dtype=np.int8).reshape((len(lst), len(lst[0])))

# array([[1, 1, 1],
#        [2, 2, 2],
#        [3, 3, 3]], dtype=int8)

答案 1 :(得分:0)

In [1]: final_array = np.empty([3, 5])
In [2]: final_array
Out[2]: 
array([[-1.52691690e-041,  6.36598743e-314,  2.01589600e-312,
         2.41907520e-312,  1.90979622e-313],
       [ 6.79038654e-313,  6.79038653e-313,  3.18299369e-313,
         2.14321575e-312,  2.37663529e-312],
       [ 4.45619117e-313,  1.93101617e-312,  8.70018274e-313,
        -1.52680304e-041,  8.70018275e-313]])

这是一个(3,5)形阵列,随机,未填充'值。

In [3]: np.concatenate([final_array, np.array([1,1,1])])    
ValueError: all the input arrays must have same number of dimensions

这不起作用,因为final_array是2d,而另一个是1d。

In [4]: np.concatenate([final_array, np.array([[1,1,1]])])

ValueError: all the input array dimensions except for the concatenation axis must match exactly

现在第二个是(1,3),它在第二个维度上与(3,5)不匹配。

In [5]: np.concatenate([final_array, np.array([[1,1,1,1,1]])])
Out[5]: 
array([[-1.52691690e-041,  6.36598743e-314,  2.01589600e-312,
         2.41907520e-312,  1.90979622e-313],
       [ 6.79038654e-313,  6.79038653e-313,  3.18299369e-313,
         2.14321575e-312,  2.37663529e-312],
       [ 4.45619117e-313,  1.93101617e-312,  8.70018274e-313,
        -1.52680304e-041,  8.70018275e-313],
       [ 1.00000000e+000,  1.00000000e+000,  1.00000000e+000,
         1.00000000e+000,  1.00000000e+000]])
In [6]: _.shape
Out[6]: (4, 5)

这样可行,在原始(3,5)中添加一个新行。但原始的随机值仍然存在。

最好建立一个数组列表,然后连接一个

In [7]: alist = []      # not at all like `np.empty`
In [8]: for i in range(3):
   ...:     alist.append(np.ones((3,),int)*(i+1))
   ...:     
In [9]: alist
Out[9]: [array([1, 1, 1]), array([2, 2, 2]), array([3, 3, 3])]

In [10]: np.array(alist)
Out[10]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

In [11]: np.stack(alist)   # equivalent
Out[11]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

In [12]: np.vstack(alist)
Out[12]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

concatenate将他们加入现有的1个维度:

In [13]: np.concatenate(alist)
Out[13]: array([1, 1, 1, 2, 2, 2, 3, 3, 3])
相关问题