numpy中hstack vstack stack concatenate函數示例詳解
大綱
本文主要介紹一下numpy中的幾個常用函數,包括hstack()、vstack()、stack()、concatenate()。
1、concatenate()
我們先來介紹最全能的concatenate()函數,後面的幾個函數其實都可以用concatenate()函數來進行等價操作。
concatenate()函數根據指定的維度,對一個元組、列表中的list或者ndarray進行連接,函數原型:
numpy.concatenate((a1, a2, ...), axis=0)
先來看幾個例子,一個2*2的數組和一個1*2的數組,在第0維進行拼接,得到一個3*2的數組:
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的數組和一個2*1的數組,在第01維進行拼接,得到一個2*3的數組:
np.concatenate((a, b.T), axis=1)
輸出為:
array([[1, 2, 5], [3, 4, 6]])
上面兩個簡單的例子中,拼接的維度的長度是不同的,但是其他維度的長度必須是相同的,這也是使用concatenate()函數的一個基本原則,違背此規則就會報錯,例如一個2*2的數組和一個1*2的數組,在第1維進行拼接:
np.concatenate((a, b), axis=1)
上面的代碼會報錯:
ValueError: all the input array dimensions except for the concatenation axis must match exactly
2、stack()
stack()函數的原型是numpy.stack(arrays, axis=0),即將一堆數組的數據按照指定的維度進行堆疊。
我們先看兩個簡單的例子:
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]])
如果換作是二維數組:
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的兩個數組必須有相同的形狀,同時,輸出的結果的維度是比輸入的數組都要多一維的。我們拿第一個例子來舉例,兩個含3個數的一維數組在第0維進行堆疊,其過程等價於先給兩個數組增加一個第0維,變為1*3的數組,再在第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()的函數原型:vstack(tup) ,參數tup可以是元組,列表,或者numpy數組,返回結果為numpy的數組。它是垂直(按照行順序)的把數組給堆疊起來。
舉兩個簡單的例子:
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的數組至少有兩維,那麼相當於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]])
可以看到,跟剛才的結果是一致的,但是如果進行堆疊的兩個數組隻有一維,那麼結果是不同的:
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()的函數原型:hstack(tup) ,參數tup可以是元組,列表,或者numpy數組,返回結果為numpy的數組。它其實就是水平(按列順序)把數組給堆疊起來,與vstack()函數正好相反。舉幾個簡單的例子:
a = np.array([1,2,3]) b = np.array([2,3,4]) np.hstack([a,b])
輸出為:
array([1, 2, 3, 2, 3, 4])
進一步,對於二維數組的情形:
a=[[1],[2],[3]] b=[[1],[2],[3]] np.hstack([a,b])
輸出為:
array([[1, 1], [2, 2], [3, 3]])
如果進行hstack的數組至少有兩維,那麼相當於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函數,跟numpy中的stack函數的作用是一樣的,我們通過例子來體會:
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]]
以上就是numpy中hstack vstack stack concatenate函數示例詳解的詳細內容,更多關於numpy函數示例的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python數據分析之堆疊數組函數示例總結
- numpy中數組拼接、數組合並方法總結(append(), concatenate, hstack, vstack, column_stack, row_stack, np.r_, np.c_等)
- numpy數組合並和矩陣拼接的實現
- Python數組變形的幾種實現方法
- Numpy數組的組合與分割實現的方法