[Numpy]stack(), hstack(), vstack(), concatenate()

部分資料來源於網絡

目錄

0. axis取值

1. stack()

2. hstack()

3. vstack()

4. concatenate()


0. axis取值

在numpy中數組都有着[ ]標記,則axis=0對應着最外層的[ ],axis=1對應第二外層的[ ],……,axis=n對應第n外層的[ ]。

sum()   不傳參:所有元素的總和

            有參數axis:將按照指定axis進行對應元素內求和


(1)axis = 0:對最外層[ ]裏的最大單位塊做塊與塊之間的運算, 同時移除最外層[ ]:

a= np.array([1,2,3])    
a.sum(axis = 0)
>>>6

因爲只有一層[ ],所以直接對1,2,3做運算
加法後本應是[6],但是移除最外層[ ]後,[ ]不存在了,所以返回的是6。

a= np.array([[1,2],[3,4]])  
a.sum(axis = 0)
>>>array([4, 6])

有兩層[ ],最外層[ ]裏的最大單位塊分別爲[1,2],[3,4],對這兩個單位塊做塊與塊之間的運算,[1,2]+[3,4] = [4, 6];
做完加法後本應是[[4, 6]],但是移除最外層[ ]後,原來的兩層[ ]變成一層[ ],所以返回結果爲 [4, 6]。

a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a.sum(axis = 0)
>>>array([[12, 14], [16, 18]])

有三層[ ],最外層[ ]裏的最大單位塊分別爲[[1,2],[3,4]],[[11,12],[13,14]],對這兩個單位塊做塊與塊之間的運算,[[1,2],[3,4]] + [[11,12],[13,14]] = [[12, 14], [16, 18]];
做完加法後本應是[[[12, 14], [16, 18]]],但是移除最外層[ ]後,原來的三層[ ]變成兩層[ ],所以返回結果爲[[12, 14], [16, 18]];

(2)axis= 1:對第二外層[]裏的最大單位塊做塊與塊之間的運算, 同時移除第二外層[]:

a= np.array([1,2,3])    
a.sum(axis = 1)
>>>ValueError: 'axis' entry is out of bounds

因爲只有一層[ ],axis取值只能爲0,否則報錯

a= np.array([[1,2],[3,4]])  
a.sum(axis = 1)
>>>array([3, 7])

a=np.array([[2],[3]])
a.sum(axis=1)
>>> array([2, 3])

有兩層[ ],第二外層[ ]裏的最大單位塊有兩組(因爲有兩個第二外層[ ]),第一組是1,2,第二組是3,4,分別對這兩個單位塊做塊與塊之間的運算,第一組結果爲1+2=3,第二組結果爲3+4=7;
做完加法後本應是[[3],[7]],但是 移除第二外層[ ] 後,原來的兩層[ ]變成一層[ ],所以返回結果爲[3, 7]。
對於第二個例子,在第二層[ ]中,第一個[ ]裏的元素只有一個2,第二個[ ]裏的元素只有一個3,都沒有可以相加的其他元素,因此返回本身,最後去掉第二層[ ],爲[2,3]

a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a.sum(axis = 1)
>>>array([[ 4,  6], [24, 26]])

有三層[ ],第二外層[ ]裏的最大單位塊有兩組(因爲有兩個第二外層[ ]),第一組是[1,2],[3,4],第二組是[11,12],[13,14],分別對這兩個單位塊做塊與塊之間的運算,第一組結果爲[1,2]+[3,4] = [ 4, 6],第二組結果爲[11,12]+[13,14] = [24, 26];
做完加法後本應是[[[ 4, 6]], [[24, 26]]],但是 移除第二外層[ ] 後,原來的三層[]變成兩層[],所以返回結果爲[[ 4, 6], [24, 26]]

1. stack()

按照指定的軸對數組序列進行聯結。

格式:numpy.stack(arrays, axis=0, out=None)
arrays :數組序列,數組的形狀(shape)必須相同

import numpy as np
a=[[1,2,3],   [4,5,6]]
b=[[1,2,3],   [4,5,6]]
c=[[1,2,3],   [4,5,6]]
print("a=",a)
print("b=",b)
print("c=",c)
print('"axis=0":\n',np.stack((a,b,c),axis=0))
print('"axis=1":\n',np.stack((a,b,c),axis=1))
print('"axis=2":\n',np.stack((a,b,c),axis=2))

                                                           

(1)axes=0:以0維度的元素爲單位

元素:[[1 2 3] [4 5 6]]——0、[[1 2 3] [4 5 6]]——1、[[1 2 3] [4 5 6]]——2

按下標[0,1,2]順序排(堆)起來即可,結果shape爲 (3, 2, 3)  即第一維度有三個元素,第二維度有2個元素,第三緯度有3個元素

(2)axes=1:以1維度的元素爲單位

元素:[1 2 3]——0、[4 5 6]——1、[1 2 3]——0、[4 5 6]——1、[1 2 3]——0、[4 5 6]——1

按下標[[0,0,0],[1,1,1]]進行堆疊即可,結果的shape爲 (2, 3, 3)

(3)axes=2:以2維度的元素爲單位

元素:1——0、2——1、3——2、4——3、5——4、6——5、1——0、2——1、3——2、4——3、5——4、6——5、1——0、2——1、3——2、4——3、5——4、6——5

按下標 [[[0,0,0],[1,1,1],[2,2,2]],[[3,3,3],[4,4,4],[5,5,5]]] 進行堆疊,結果的shape爲 (2, 3, 3)


2. hstack()

水平(按列順序)把數組給堆疊起來,等價於np.concatenate(tup,axis=1)

格式:numpy.hstack(tup)
tup:元組,列表,或者numpy數組,返回結果爲numpy的數組

The arrays must have the same shape along all but the second axis,except 1-D arrays which can be any length.

(1)一維數組的堆疊可以是不同長度

b = np.hstack(([1,3,5], [2,5,6,7,8]))
print(b)
>>>[1 3 5 2 5 6 7 8]

(2)其它數組堆疊時,除了第二個軸的長度([1, 2]與[7]的長度)可以不同外,其它軸的長度(即元素個數 ,如下例所示均爲兩個元素)必須相同。

a = np.array([[1, 2], [3, 4]])
b = np.array([[7], [5]])
print(np.hstack((a, b)))
>>>[[1 2 7]
    [3 4 5]]

3. vstack()

格式:numpy.vstack(tup)

tup:元組,列表,或者numpy數組,返回結果爲numpy的數組

等價於:np.concatenate(tup,axis=0) 

The arrays must have the same shape along all but the first axis.1-D arrays must have the same length.

(1)一維數組進行堆疊,則數組長度必須相同

#1
print(np.vstack([1,2,3]))
>>>[[1]
    [2]
    [3]]
#2
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
np.vstack((a,b))
>>>array([[1, 2, 3],
          [2, 3, 4]])
#3
az = np.array([1, 2])
b = np.array([[2, 3],[0]]) # 將列表視爲一個元素,因此一維數組的長度相等
print(np.vstack((a,b)))
>>>[[1 2]
    [list([2, 3]) list([0])]]
#4
az = np.array([1, 2])
b = np.array([2, 3])  # 兩個長度相等的一維數組,若b = np.array([2, 4, 3])則報錯 
print(np.vstack((a,b)))
>>>[[1 2]
    [2 3]]

(2)其它數組堆疊時,除數組第一個軸的長度可以不同,其它軸長度必須一樣。

a = np.array([[1, 8, 2]])
b = np.array([[2, 3, 8],[2, 0, 0]])  
"""
二維數組,雖然元素個數不一樣,但單個元素的長度相同
若b = np.array([[2, 3, 8],[2, 0, 0], [2]) 則報錯, 因爲單個元素的長度不同
"""
print(np.vstack((a,b)))
>>>[[1 8 2]
    [2 3 8]
    [2 0 0]]

4. concatenate()

格式:numpy.concatenate((a1, a2, ...), axis=0, out=None)

將具有相同結構的array序列結合成一個array

axis是拼接方向,0爲橫軸,1爲縱軸。

發佈了55 篇原創文章 · 獲贊 17 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章