大纲
本文主要介绍一下numpy中的几个常用函数,包括hstack()、vstack()、stack()、concatenate()。
1、concatenate()
我们先来介绍最全能的concatenate()函数,后面的几个函数其实都可以用concatenate()函数来进行等价操作。
concatenate()函数根据指定的维度,对一个元组、列表中的list或者ndarray进行连接,函数原型:
1 | numpy.concatenate((a1, a2, ...), axis = 0 ) |
先来看几个例子,一个2*2的数组和一个1*2的数组,在第0维进行拼接,得到一个3*2的数组:
1 2 3 | a = np.array([[ 1 , 2 ], [ 3 , 4 ]]) b = np.array([[ 5 , 6 ]]) np.concatenate((a, b), axis = 0 ) |
输出为:
1 2 3 | array([[ 1 , 2 ], [ 3 , 4 ], [ 5 , 6 ]]) |
进一步,一个2*2的数组和一个2*1的数组,在第01维进行拼接,得到一个2*3的数组:
1 | np.concatenate((a, b.T), axis = 1 ) |
输出为:
1 2 | array([[ 1 , 2 , 5 ], [ 3 , 4 , 6 ]]) |
上面两个简单的例子中,拼接的维度的长度是不同的,但是其他维度的长度必须是相同的,这也是使用concatenate()函数的一个基本原则,违背此规则就会报错,例如一个2*2的数组和一个1*2的数组,在第1维进行拼接:
1 | np.concatenate((a, b), axis = 1 ) |
上面的代码会报错:
1 | ValueError: all the input array dimensions except for the concatenation axis must match exactly |
2、stack()
stack()函数的原型是numpy.stack(arrays, axis=0),即将一堆数组的数据按照指定的维度进行堆叠。
我们先看两个简单的例子:
1 2 3 | a = np.array([ 1 , 2 , 3 ]) b = np.array([ 2 , 3 , 4 ]) np.stack([a,b],axis = 0 ) |
输出为:
1 2 | array([[ 1 , 2 , 3 ], [ 2 , 3 , 4 ]]) |
进一步:
1 | np.stack([a,b],axis = 1 ) |
输出为:
1 2 3 | array([[ 1 , 2 ], [ 2 , 3 ], [ 3 , 4 ]]) |
如果换作是二维数组:
1 2 3 | a = np.array([[ 1 , 2 , 3 ]]) b = np.array([[ 2 , 3 , 4 ]]) np.stack([a,b],axis = 0 ) |
输出为:
1 2 | array([[[ 1 , 2 , 3 ]], [[ 2 , 3 , 4 ]]]) |
可以看到,进行stack的两个数组必须有相同的形状,同时,输出的结果的维度是比输入的数组都要多一维的。我们拿第一个例子来举例,两个含3个数的一维数组在第0维进行堆叠,其过程等价于先给两个数组增加一个第0维,变为1*3的数组,再在第0维进行concatenate()操作:
1 2 3 4 5 | a = np.array([ 1 , 2 , 3 ]) b = np.array([ 2 , 3 , 4 ]) a = a[np.newaxis,:] b = b[np.newaxis,:] np.concatenate([a,b],axis = 0 ) |
输出为:
1 2 | array([[ 1 , 2 , 3 ], [ 2 , 3 , 4 ]]) |
3、vstack()
vstack()的函数原型:vstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。它是垂直(按照行顺序)的把数组给堆叠起来。
举两个简单的例子:
1 2 3 | a = np.array([ 1 , 2 , 3 ]) b = np.array([ 2 , 3 , 4 ]) np.vstack([a,b]) |
输出为:
1 2 | array([[ 1 , 2 , 3 ], [ 2 , 3 , 4 ]]) |
进一步:
1 2 3 | a = [[ 1 ],[ 2 ],[ 3 ]] b = [[ 1 ],[ 2 ],[ 3 ]] np.vstack([a,b]) |
输出为:
1 2 3 4 5 6 | array([[ 1 ], [ 2 ], [ 3 ], [ 1 ], [ 2 ], [ 3 ]]) |
如果进行vstack的数组至少有两维,那么相当于np.concatenate([a,b],axis=0),我们通过例子进行对比:
1 2 3 | a = [[ 1 ],[ 2 ],[ 3 ]] b = [[ 1 ],[ 2 ],[ 3 ]] np.concatenate([a,b],axis = 0 ) |
输出为:
1 2 3 4 5 6 | array([[ 1 ], [ 2 ], [ 3 ], [ 1 ], [ 2 ], [ 3 ]]) |
可以看到,跟刚才的结果是一致的,但是如果进行堆叠的两个数组只有一维,那么结果是不同的:
1 2 3 | a = np.array([ 1 , 2 , 3 ]) b = np.array([ 2 , 3 , 4 ]) np.concatenate([a,b],axis = 0 ) |
上面得到的结果为:
1 | array([ 1 , 2 , 3 , 2 , 3 , 4 ]) |
4、hstack()
hstack()的函数原型:hstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。它其实就是水平(按列顺序)把数组给堆叠起来,与vstack()函数正好相反。举几个简单的例子:
1 2 3 | a = np.array([ 1 , 2 , 3 ]) b = np.array([ 2 , 3 , 4 ]) np.hstack([a,b]) |
输出为:
1 | array([ 1 , 2 , 3 , 2 , 3 , 4 ]) |
进一步,对于二维数组的情形:
1 2 3 | a = [[ 1 ],[ 2 ],[ 3 ]] b = [[ 1 ],[ 2 ],[ 3 ]] np.hstack([a,b]) |
输出为:
1 2 3 | array([[ 1 , 1 ], [ 2 , 2 ], [ 3 , 3 ]]) |
如果进行hstack的数组至少有两维,那么相当于np.concatenate([a,b],axis=1)
1 2 3 | a = [[ 1 ],[ 2 ],[ 3 ]] b = [[ 1 ],[ 2 ],[ 3 ]] np.concatenate([a,b],axis = 1 ) |
输出跟刚才的结果是一致的
1 2 3 | array([[ 1 , 1 ], [ 2 , 2 ], [ 3 , 3 ]]) |
只有一维的情况下,并不等价于np.concatenate([a,b],axis=1),反而等价于np.concatenate([a,b],axis=0)。
5、tf中的stack()
tensorflow中也提供了stack函数,跟numpy中的stack函数的作用是一样的,我们通过例子来体会:
1 2 3 4 5 6 7 8 9 10 | import tensorflow as tf a = tf.convert_to_tensor([ 1 , 2 , 3 ]) b = tf.convert_to_tensor([ 2 , 3 , 4 ]) stack_ab = tf.stack([a,b]) a1 = tf.expand_dims(a,axis = 0 ) b1 = tf.expand_dims(b,axis = 0 ) concat_ab = tf.concat([a1,b1],axis = 0 ) with tf.Session() as sess: print (sess.run(stack_ab)) print (sess.run(concat_ab)) |
输出为:
1 2 3 4 | [[ 1 2 3 ] [ 2 3 4 ]] [[ 1 2 3 ] [ 2 3 4 ]] |
以上就是numpy中hstack vstack stack concatenate函数示例详解的详细内容,更多关于numpy函数示例的资料请关注IT俱乐部其它相关文章!