本文主要介紹一下numpy中的幾個常用函數(shù)变屁,包括hstack()、vstack()意狠、stack()敞贡、concatenate()。
1摄职、concatenate()
我們先來介紹最全能的concatenate()函數(shù)誊役,后面的幾個函數(shù)其實都可以用concatenate()函數(shù)來進行等價操作获列。
concatenate()函數(shù)根據(jù)指定的維度,對一個元組蛔垢、列表中的list或者ndarray進行連接击孩,函數(shù)原型:
numpy.concatenate((a1, a2, ...), axis=0)
先來看幾個例子,一個2*2的數(shù)組和一個1*2的數(shù)組鹏漆,在第0維進行拼接巩梢,得到一個3*2的數(shù)組:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
輸出為:
array([[1, 2],
[3, 4],
[5, 6]])
進一步,一個2*2的數(shù)組和一個2*1的數(shù)組艺玲,在第01維進行拼接括蝠,得到一個2*3的數(shù)組:
np.concatenate((a, b.T), axis=1)
輸出為:
array([[1, 2, 5],
[3, 4, 6]])
上面兩個簡單的例子中,拼接的維度的長度是不同的饭聚,但是其他維度的長度必須是相同的忌警,這也是使用concatenate()函數(shù)的一個基本原則,違背此規(guī)則就會報錯秒梳,例如一個2*2的數(shù)組和一個1*2的數(shù)組法绵,在第1維進行拼接:
np.concatenate((a, b), axis=1)
上面的代碼會報錯:
ValueError: all the input array dimensions except for the concatenation axis must match exactly
2、stack()
stack()函數(shù)的原型是numpy.stack(arrays, axis=0)酪碘,即將一堆數(shù)組的數(shù)據(jù)按照指定的維度進行堆疊朋譬。
我們先看兩個簡單的例子:
a = np.array([1,2,3])
b = np.array([2,3,4])
np.stack([a,b],axis=0)
輸出為:
array([[1, 2, 3],
[2, 3, 4]])
進一步:
np.stack([a,b],axis=1)
輸出為:
array([[1, 2],
[2, 3],
[3, 4]])
如果換作是二維數(shù)組:
a = np.array([[1,2,3]])
b = np.array([[2,3,4]])
np.stack([a,b],axis=0)
輸出為:
array([[[1, 2, 3]],
[[2, 3, 4]]])
可以看到,進行stack的兩個數(shù)組必須有相同的形狀兴垦,同時徙赢,輸出的結果的維度是比輸入的數(shù)組都要多一維的。我們拿第一個例子來舉例探越,兩個含3個數(shù)的一維數(shù)組在第0維進行堆疊犀忱,其過程等價于先給兩個數(shù)組增加一個第0維,變?yōu)?*3的數(shù)組扶关,再在第0維進行concatenate()操作:
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)
輸出為:
array([[1, 2, 3],
[2, 3, 4]])
3阴汇、vstack()
vstack()的函數(shù)原型:vstack(tup) ,參數(shù)tup可以是元組节槐,列表搀庶,或者numpy數(shù)組,返回結果為numpy的數(shù)組铜异。它是垂直(按照行順序)的把數(shù)組給堆疊起來哥倔。
舉兩個簡單的例子:
a = np.array([1,2,3])
b = np.array([2,3,4])
np.vstack([a,b])
輸出為:
array([[1, 2, 3],
[2, 3, 4]])
進一步:
a=[[1],[2],[3]]
b=[[1],[2],[3]]
np.vstack([a,b])
輸出為:
array([[1],
[2],
[3],
[1],
[2],
[3]])
如果進行vstack的數(shù)組至少有兩維,那么相當于np.concatenate([a,b],axis=0)揍庄,我們通過例子進行對比:
a=[[1],[2],[3]]
b=[[1],[2],[3]]
np.concatenate([a,b],axis=0)
輸出為:
array([[1],
[2],
[3],
[1],
[2],
[3]])
可以看到咆蒿,跟剛才的結果是一致的,但是如果進行堆疊的兩個數(shù)組只有一維,那么結果是不同的:
a = np.array([1,2,3])
b = np.array([2,3,4])
np.concatenate([a,b],axis=0)
上面得到的結果為:
array([1, 2, 3, 2, 3, 4])
4沃测、hstack()
hstack()的函數(shù)原型:hstack(tup) 缭黔,參數(shù)tup可以是元組,列表蒂破,或者numpy數(shù)組馏谨,返回結果為numpy的數(shù)組。它其實就是水平(按列順序)把數(shù)組給堆疊起來附迷,與vstack()函數(shù)正好相反惧互。舉幾個簡單的例子:
a = np.array([1,2,3])
b = np.array([2,3,4])
np.hstack([a,b])
輸出為:
array([1, 2, 3, 2, 3, 4])
進一步,對于二維數(shù)組的情形:
a=[[1],[2],[3]]
b=[[1],[2],[3]]
np.hstack([a,b])
輸出為:
array([[1, 1],
[2, 2],
[3, 3]])
如果進行hstack的數(shù)組至少有兩維喇伯,那么相當于np.concatenate([a,b],axis=1)
a=[[1],[2],[3]]
b=[[1],[2],[3]]
np.concatenate([a,b],axis=1)
輸出跟剛才的結果是一致的
array([[1, 1],
[2, 2],
[3, 3]])
只有一維的情況下喊儡,并不等價于np.concatenate([a,b],axis=1),反而等價于np.concatenate([a,b],axis=0)稻据。
5艾猜、tf中的stack()
tensorflow中也提供了stack函數(shù),跟numpy中的stack函數(shù)的作用是一樣的攀甚,我們通過例子來體會:
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]
[2 3 4]]
[[1 2 3]
[2 3 4]]