部分資料來源於網絡
目錄
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爲縱軸。