在Python中加入数组

时间:2016-08-08 17:37:05

标签: python arrays numpy

嗨我想在python中加入多个数组,使用numpy形成多维数组,它在for循环中,这是一个伪代码

import numpy as np
h = np.zeros(4)
for x in range(3):
   x1 = some array of length of 4 returned from a previous function (3,5,6,7)
   h = np.concatenate((h,x1), axis =0)

第一次迭代没问题,但是在for循环的第二次迭代中,我得到以下错误,

  

ValueError:所有输入数组必须具有相同的维数

输出数组看起来应该是这样的

 [[0,0,0,0],[3,5,6,7],[6,3,6,7]]

那么如何加入阵列呢?

由于

3 个答案:

答案 0 :(得分:1)

您需要使用vstack。它允许您堆叠数组。您获取一系列数组并将它们垂直堆叠以生成单个数组

 import numpy as np  
 h = np.zeros(4)
 for x in range(3):
     x1 = [3,5,6,7]
     h = np.vstack((h,x1))
     # not h = np.concatenate((h,x1), axis =0)

  print h

输出:

[[ 0.  0.  0.  0.]
 [ 3.  5.  6.  7.]
 [ 3.  5.  6.  7.]
 [ 3.  5.  6.  7.]]

稍后会进行更多修改。 如果您只想使用cocatenate,您也可以采用以下方式:

 import numpy as np
 h1 = np.zeros(4)

 for x in range(3):
      x1 = np.array([3,5,6,7])
      h1= np.concatenate([h1,x1.T], axis =0)

 print h1.shape
 print h1.reshape(4,4)

输出:

(16,)
[[ 0.  0.  0.  0.]
 [ 3.  5.  6.  7.]
 [ 3.  5.  6.  7.]
 [ 3.  5.  6.  7.]]

两者都有不同的应用。您可以根据需要选择。

答案 1 :(得分:1)

最好在列表中收集值,并在结束时执行一次连接或数组创建。

h = [np.zeros(4)]
for x in range(3):
   x1 = some array of length of 4 returned from a previous function (3,5,6,7)
   h = h.append(x1)
h = np.array(h)
# or h = np.vstack(h)

所有concatenate/stack/array函数都会获取多个项目的列表。附加到列表比连接2个项目更快。

======================

让我们一步一步地尝试您的方法:

In [189]: h=np.zeros(4)
In [190]: h
Out[190]: array([ 0.,  0.,  0.,  0.])    # 1d array (4,) shape
In [191]: x1=np.array([3,5,6,7])     # another 1d
In [192]: h1=np.concatenate((h,x1),axis=0)
In [193]: h1
Out[193]: array([ 0.,  0.,  0.,  0.,  3.,  5.,  6.,  7.])
In [194]: h1.shape
Out[194]: (8,)       # also a 1d array, but with 8 items
In [195]: x1=np.array([6,3,6,7])
In [196]: h1=np.concatenate((h1,x1),axis=0)
In [197]: h1
Out[197]: array([ 0.,  0.,  0.,  0.,  3.,  5.,  6.,  7.,  6.,  3.,  6.,  7.])

在这种情况下,我依次添加(4,)数组,仍然获得1d数组。

如果我将创建x1作为2d (1,4)返回:

In [198]: h=np.zeros(4)
In [199]: x1=np.array([[6,3,6,7]])
In [200]: h1=np.concatenate((h,x1),axis=0)
...
ValueError: all the input arrays must have same number of dimensions

我马上得到了这个尺寸错误。

你在第二次迭代时得到错误这一事实表明第一个x1(4,),但第二个是2d。

如果您有这样的尺寸错误,请检查形状。

vstack根据需要为输入添加维度,因此您可以构建二维数组:

In [207]: h=np.zeros(4)
In [208]: x1=np.array([3,5,6,7])
In [209]: h=np.vstack((h,x1))
In [210]: h
Out[210]: 
array([[ 0.,  0.,  0.,  0.],
       [ 3.,  5.,  6.,  7.]])
In [211]: x1=np.array([6,3,6,7])
In [212]: h=np.vstack((h,x1))
In [213]: h
Out[213]: 
array([[ 0.,  0.,  0.,  0.],
       [ 3.,  5.,  6.,  7.],
       [ 6.,  3.,  6.,  7.]])

答案 2 :(得分:1)

有多种方法可以做到这一点。我将列举几个例子:

首先,我们导入numpy并定义一个生成长度为4的数组的函数。

import numpy as np

def previous_function_returning_array_of_length_4(x):
    return np.array(range(4)) + x

第一种方法是创建数组列表,然后调用numpy.array()将列表转换为2D数组。

h0 = np.zeros(4)
arrays = [h0]
for x in range(3):
    x1 = previous_function_returning_array_of_length_4(x)
    arrays.append(x1)

h = np.array(arrays)

您可以对np.vstack()执行相同操作:

h0 = np.zeros(4)
arrays = [h0]
for x in range(3):
    x1 = previous_function_returning_array_of_length_4(x)
    arrays.append(x1)

h = np.vstack(arrays)

或者,如果您知道要创建的阵列数量,可以先创建2D阵列并填写值:

h = np.zeros((4, 4))
for ii in range(3):
    x1 = previous_function_returning_array_of_length_4(ii)
    h[ii + 1, ...] = x1

还有更多方法,但希望这会让你知道该怎么做。