2017-02-02 71 views
1

我想从一个空的NumPy数组开始,然后依次向它添加行(所有行的长度都是相同的)。但是,在开始时,我不知道行的长度,也不知道我将添加多少行。我怎样才能做到这一点?连接NumPy数组

所以我三行:

a = np.array([1, 1, 1]) 
b = np.array([2, 2, 2]) 
c = np.array([3, 3, 3]) 

这是我曾尝试:

x = [] 
x = np.concatenate(x, a) 
x = np.concatenate(x, b) 
x = np.concatenate(x, c) 

这没有工作,因为它加到ab到长度为6的单一阵列,而不是一个大小的数组(2,3)。 有什么帮助吗?

+3

“我想用一个空NumPy的阵列开始,然后依次添加行它” - 这原来是用NumPy的阵列的工作的残暴低效的方式。如果您无法一次构建数组,请在列表中累积行,然后在最后一步将行粘在一起。 – user2357112

+0

这不是你如何调用'concatenate'。您为它提供了您想要加入的数组的列表。连接的第二个参数是'axis'。 – hpaulj

回答

2

收藏列表中的所有行,然后使用vstack

a = np.array([1, 1, 1]) 
b = np.array([2, 2, 2]) 
c = np.array([3, 3, 3]) 
x = np.vstack([a,b,c]) 
+2

对于这个'np.array([a,b,c])'也是如此,'np.stack([a,b,c],axis = 0)'' – hpaulj

0

而是与

x = [] 

开始的,你可以说

x = numpy.zeros([0, 3]) # 2-dimensional array with 0 rows and 3 columns 

,然后加入行是这样的:

x = numpy.vstack([x, a]) 
x = numpy.vstack([x, b]) 
x = numpy.vstack([x, c]) 

...但作为user2357112指出的那样,这是更有效的一个列表开始,做x.append(each_array),只有串联阵列的列表为单一numpy.ndarray右底:

x = [] 
x.append(a) 
x.append(b) 
x.append(c) 
x = numpy.vstack(x) 

NB :numpy.concatenate([x,a])正在朝着您没有预料到的方向工作,因为尽管numpy.concatenate的默认方向确实为axis=0,传统上这被认为是二维阵列中行对行方向,但您的阵列a,bc不是二维数组,因此不能被认为是单一的“行”开始。他们只有具有维度0,因此它们的现有元素沿着维度0变化 - 沿着您连接的维度相同。要做你想做的事,你必须使用双括号来定义它们,如a = numpy.array([[1,1,1]])或者通过在连接之前说b = b[numpy.newaxis, :]将它们从现有的一维状态转换。 numpy.vstack隐式地为你做后者。

0

另一种方法是使用numpy.concatenate。它比numpy.vstacknumpy.hstack更通用,因为它允许您选择连接矢量/矩阵/数组的轴。

实施例:

>>> X, Y, Z, T = numpy.random.randint(low=0, high=10, size=(4, 3, 1), dtype='I') 
>>> numpy.concatenate((X, Y, Z, T), axis=1) 
array([[0, 7, 1, 7], 
     [8, 4, 7, 7], 
     [1, 9, 9, 7]], dtype=uint32)