1. 程式人生 > >Python學習筆記-資料分析-Numpy02-通用函式

Python學習筆記-資料分析-Numpy02-通用函式

Numpy通用函式

一、陣列形狀— —.T/.reshape()和.resize()**

1、numpy.T :轉置,例如原shape為(3,4)/(2,3,4),轉置結果為(4,3)/(4,3,2) → 所以一維陣列轉置後結果不變
# 陣列形狀:.T
import numpy as np
ar1 = np.arange(1,11)
ar2 = np.zeros((2,5))
print(ar1)
print(ar2)
print('----------上面是原陣列--------------')
# 注意:一維陣列在轉置後沒有任何變化。
print(ar1.T)
# 二維陣列原來是(2,5)也就是2行5列,轉置後變成5行2列。
print(ar2.T)

執行結果如下:

[ 1  2  3  4  5  6  7  8  9 10]
[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
----------上面是原陣列--------------
[ 1  2  3  4  5  6  7  8  9 10]
[[0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]]
2、numpy.reshape():為陣列提供新形狀,而不更改其資料,所以元素數量需要一致!
ar3 = np.ones((3,4))
# 注意:在陣列進行形狀變化時,元素的個數一定要保持一致,
# 原陣列為一維的有10個元素,現在變成了(2,5)即2行5列,也是10個元素
print(ar1)
print(ar1.reshape(2,5))
print('---------------------------------')


# 原來的陣列元素是(3,4)也就是3行4列共12個元素,變形後為(6,2)即6行2列共12個元素。
print(ar3)
print(ar3.reshape(6,2))
print('---------------------------------')

# 可直接在陣列生成的時候改變形狀
print(np.zeros((5,10)).reshape(2,25))
print('---------------------------------')

# 可直接在方法內容寫上形狀並生成新的陣列
# 注意:1、引數之間括號不要丟失。2、元素個數要相同。
print(np.reshape(np.arange(16),(4,4)))

執行結果如下:

[ 1  2  3  4  5  6  7  8  9 10]
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
---------------------------------
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
[[1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]]
---------------------------------
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0.]]
---------------------------------
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
3、numpy.resize(a, new_shape):返回具有指定形狀的新陣列,如有必要可重複填充所需數量的元素。
# 生成的陣列只有5個元素,但是resize要12個元素,所以進行了重複填充
ar4 = np.resize(np.arange(5),(3,4))
print(ar4)
print('----------------')
# 生成的陣列有15個元素,但是resize要12個元素,所以將多餘的元素刪除了。
ar5 = np.resize(np.arange(15),(3,4))
print(ar5)

執行結果如下:

[[0 1 2 3]
 [4 0 1 2]
 [3 4 0 1]]
----------------
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
關於resize的特別說明
s = np.arange(10)
print('這是原陣列:-->','\n',s)

# 如果對陣列s直接用.resize()的話,是不生成陣列的。
#print('這裡沒有生成任何陣列:-->',s.resize(3,4))
# 如果通過np.resize()對s進行操作的話,不僅生成新陣列,而且還修改了原陣列“s”。
print('這裡不僅生成了新的陣列,而且還改變了原陣列',np.resize(s,(3,4)))

# 關於上面這兩句的說明:由於一個是傳址一個傳值,所以放在一個程式碼塊裡直接執行會報錯,故將其中一句註釋掉。

print('-----------------------------')
print('這裡原陣列"s"已經被改變了:-->','\n',s)

執行結果如下:

這是原陣列:--> 
 [0 1 2 3 4 5 6 7 8 9]
這裡不僅生成了新的陣列,而且還改變了原陣列 [[0 1 2 3]
 [4 5 6 7]
 [8 9 0 1]]
-----------------------------
這裡原陣列"s"已經被改變了:--> 
 [0 1 2 3 4 5 6 7 8 9]

二、陣列複製— —直接賦值和copy()

ar6 = np.arange(10)
ar7 = ar6
print(ar7 is ar6)
# 指向記憶體中生成的一個值 → 這裡ar6和ar7指向同一個值,所以ar7改變,ar6一起改變
ar6[2] = 666
print(ar6)
print(ar7)
print('------------------------')

# copy方法生成陣列及其資料的完整拷貝
ar8 = ar6.copy()
print(ar8 is ar6)
ar6[3] = 777
print(ar6,ar8)

# 關於是傳值還是傳址的一些說明
a = np.arange(8)
print('陣列a是這樣的:','\n',a)
# 生成了新的陣列。
print(np.resize(a, (2,5)), type(np.resize(a, (2,5))))
# 沒有生成新的陣列,結果是一個None
print(a.resize(2,4))

執行結果如下:

True
[  0   1 666   3   4   5   6   7   8   9]
[  0   1 666   3   4   5   6   7   8   9]
------------------------
False
[  0   1 666 777   4   5   6   7   8   9] [  0   1 666   3   4   5   6   7   8   9]
陣列a是這樣的: 
 [0 1 2 3 4 5 6 7]
[[0 1 2 3 4]
 [5 6 7 0 1]] <class 'numpy.ndarray'>
None

三、陣列堆疊— —hstack()、vstack()和stack()

1、hstack()和vstack()

# 陣列堆疊 hstack():水平(按列順序)堆疊陣列
# a為一維陣列,5個元素
a = np.arange(5) 
# b為一維陣列,4個元素
b = np.arange(5,9) 

# 對陣列a和b進行水平(按列順序)堆疊陣列
# 注意:((a,b)),這裡形狀可以不一樣
ar1 = np.hstack((a,b))  
print('陣列a:', a, a.shape)
print('陣列b:', b, b.shape)
print('陣列ar1:', ar1, ar1.shape)

# a為二維陣列,3行1列
a = np.array([[1],[2],[3]])   
# b為二維陣列,3行1列
b = np.array([['a'],['b'],['c']]) 

# 二維陣列的堆疊
ar2 = np.hstack((a,b))  
print('二維陣列a:','\n', a, a.shape)
print('二維陣列b:','\n', b, b.shape)
print('二維陣列ar2:','\n', ar2 ,ar2.shape)
print('----------------------------')

# 陣列堆疊 vstack():垂直(按列順序)堆疊陣列
a = np.arange(5)    
b = np.arange(5,10)
# 對陣列a和b進行垂直(按列順序)堆疊陣列
ar1 = np.vstack((a,b))
print('陣列a:', a, a.shape)
print('陣列b:', b, b.shape)
print('陣列ar1:', ar1, ar1.shape)

a = np.array([[1],[2],[3]])
b = np.array([['a'],['b'],['c'],['d']])   
ar2 = np.vstack((a,b))  # 這裡形狀可以不一樣
print('陣列a:','\n', a, a.shape)
print('陣列b:','\n', b, b.shape)
print('陣列ar2:','\n', ar2 ,ar2.shape)
print('----------------------------')

執行結果如下:

陣列a: [0 1 2 3 4] (5,)
陣列b: [5 6 7 8] (4,)
陣列ar1: [0 1 2 3 4 5 6 7 8] (9,)
二維陣列a: 
 [[1]
 [2]
 [3]] (3, 1)
二維陣列b: 
 [['a']
 ['b']
 ['c']] (3, 1)
二維陣列ar2: 
 [['1' 'a']
 ['2' 'b']
 ['3' 'c']] (3, 2)
----------------------------
陣列a: [0 1 2 3 4] (5,)
陣列b: [5 6 7 8 9] (5,)
陣列ar1: [[0 1 2 3 4]
 [5 6 7 8 9]] (2, 5)
陣列a: 
 [[1]
 [2]
 [3]] (3, 1)
陣列b: 
 [['a']
 ['b']
 ['c']
 ['d']] (4, 1)
陣列ar2: 
 [['1']
 ['2']
 ['3']
 ['a']
 ['b']
 ['c']
 ['d']] (7, 1)
----------------------------

2、stack()

# a b c分別是3個1維陣列,每個陣列都有5個元素
a = np.arange(1, 7)
b = np.arange(11, 17)
c = np.arange(101, 107)
# 檢視陣列,陣列型別和維度
print(a, '\n', type(a), a.ndim)
print(b, '\n', type(b), b.ndim)
print(c, '\n', type(c), c.ndim)
# 將陣列a、b、c進行堆疊,並增加一個維度。堆疊方式是行。
# 這裡需要注意,axis的引數不是隨便寫的。與陣列中元素的維度有關係,如果元素的維度是1,那麼axis就只能是0和1。

# 當axis=0的時候堆疊方式是以行的形式來進行。即現把陣列a當作第一行,陣列b當作第二行,陣列c當作第三行。
x = np.stack((a,b,c),axis = 0)
print(x,type(x),'\n',x.ndim)
print('_________________________')
# 當axis=1的時候堆疊方式是以列的形式來進行。即現把陣列a當作第一列,陣列b當作第二列,陣列c當作第三列。
y = np.stack((a,b,c),axis = 1)
print(y,type(y),'\n',y.ndim)
print('_________________________')

執行結果如下:

[1 2 3 4 5 6] 
 <class 'numpy.ndarray'> 1
[11 12 13 14 15 16] 
 <class 'numpy.ndarray'> 1
[101 102 103 104 105 106] 
 <class 'numpy.ndarray'> 1
 [[  1   2   3   4   5   6]
 [ 11  12  13  14  15  16]
 [101 102 103 104 105 106]] <class 'numpy.ndarray'> 
 2
_________________________
[[  1  11 101]
 [  2  12 102]
 [  3  13 103]
 [  4  14 104]
 [  5  15 105]
 [  6  16 106]] <class 'numpy.ndarray'> 
 2
# d e f分別是3個2維陣列,每個陣列都有2個元素,陣列的形狀是2行3列。
d = np.arange(3, 9).reshape((2, 3))
e = np.arange(13, 19).reshape((2, 3))
f = np.arange(103, 109).reshape((2, 3))
# 檢視陣列,陣列型別和維度
print(d, '\n', type(d), d.ndim)
print(e, '\n', type(e), e.ndim)
print(f, '\n', type(f), f.ndim)
# 這裡需要注意,axis的引數不是隨便寫的。與陣列中元素的維度有關係,如果元素的維度是2,那麼axis就只能是0、1、2。
# 當axis=0的時候堆疊方式是以行的形式來進行。即現把陣列a當作第一行,陣列b當作第二行,陣列c當作第三行。
# 注意:下面print語句中的中文說明裡,所寫到的行和列,僅僅是對打印出的圖形而言,不是真正的陣列在空間中的表現。
x = np.stack((d,e,f),axis = 0)
print('當axis=0的時候堆疊方式是以行的形式來進行。即現把陣列d當作第一行,陣列e當作第二行,陣列f當作第三行。')
print(x,type(x),'\n', x.ndim, x.shape)
print('_________________________')
print('當axis=1的時候堆疊方式是以行的方式先拆分元素,然後在按行進行堆疊。可以看出第一個3*3的陣列是由是d,e,f中每個陣列的第一行堆疊而成')
y = np.stack((d,e,f),axis = 1)
print(y,type(y),'\n',y.ndim, y.shape)
print('_________________________')
print('當axis=2的時候堆疊方式是以列的方式先拆分元素,然後在按列進行堆疊。可以看到第一個3*3的陣列是由d,e,f中的第一列向量組合而成')
z = np.stack((d,e,f),axis = 2)
print(z,type(z),'\n',z.ndim, z.shape)

執行結果如下:

[[3 4 5]
 [6 7 8]] 
 <class 'numpy.ndarray'> 2
[[13 14 15]
 [16 17 18]] 
 <class 'numpy.ndarray'> 2
[[103 104 105]
 [106 107 108]] 
 <class 'numpy.ndarray'> 2
 當axis=0的時候堆疊方式是以行的形式來進行。即現把陣列d當作第一行,陣列e當作第二行,陣列f當作第三行。
[[[  3   4   5]
  [  6   7   8]]

 [[ 13  14  15]
  [ 16  17  18]]

 [[103 104 105]
  [106 107 108]]] <class 'numpy.ndarray'> 
 3 (3, 2, 3)
_________________________
當axis=1的時候堆疊方式是以行的方式先拆分元素,然後在按行進行堆疊。可以看出第一個3*3的陣列是由是d,e,f中每個陣列的第一行堆疊而成
[[[  3   4   5]
  [ 13  14  15]
  [103 104 105]]

 [[  6   7   8]
  [ 16  17  18]
  [106 107 108]]] <class 'numpy.ndarray'> 
 3 (2, 3, 3)
_________________________
當axis=2的時候堆疊方式是以列的方式先拆分元素,然後在按列進行堆疊。可以看到第一個3*3的陣列是由d,e,f中的第一列向量組合而成
[[[  3  13 103]
  [  4  14 104]
  [  5  15 105]]

 [[  6  16 106]
  [  7  17 107]
  [  8  18 108]]] <class 'numpy.ndarray'> 
 3 (2, 3, 3)

四、陣列拆分— —hsplit()和vsplit()

# numpy.hsplit():將陣列水平(逐列)拆分為多個子陣列 → 按列拆分

# 再次強調reshape()的引數一定要和前面生成陣列的個數保持一致。
ar = np.arange(9).reshape(3,3)

# 將陣列ar差分成3個數組
# ar1的輸出結果為列表
ar1 = np.hsplit(ar,3)
print('陣列ar1:','\n',ar1, '\n', '元素的型別:', type(ar1))
print('陣列ar: ', ar)
# 列表中元素為陣列
ar2 = np.hsplit(ar,3)[2]
print('陣列ar中下標為2的元素:','\n',ar2, '\n', '元素的型別:', type(ar2))

print('---------------------------------')
# numpy.vsplit():將陣列垂直(行方向)拆分為多個子陣列 → 按行拆
ar2 = np.vsplit(ar,3)
print(ar2,type(ar2))

執行結果如下:

陣列ar1: 
 [array([[0],
       [3],
       [6]]), array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]])] 
 元素的型別: <class 'list'>
陣列ar:  [[0 1 2]
 [3 4 5]
 [6 7 8]]
陣列ar中下標為2的元素: 
 [[2]
 [5]
 [8]] 
 元素的型別: <class 'numpy.ndarray'>
---------------------------------
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])] <class 'list'>

五、陣列簡單運算

ar = np.arange(6).reshape(2,3)
# 加法
print(ar + 10) 
# 乘法
print(ar * 2)   
# 除法
print(1 / (ar+1)) 
# 冪
print(ar ** 0.5)  

# 常用函式
# 求平均值
print(ar.mean())  
# 求最大值
print(ar.max()) 
# 求最小值
print(ar.min())  
# 求標準差
print(ar.std()) 
# 求方差
print(ar.var())  
# 求和,np.sum() → axis為0,按列求和;axis為1,按行求和
print(ar.sum(), np.sum(ar,axis = 0))  
# 排序
print(np.sort(np.array([1,4,3,2,5,6])))  

執行結果如下:

[[10 11 12]
 [13 14 15]]
[[ 0  2  4]
 [ 6  8 10]]
[[1.         0.5        0.33333333]
 [0.25       0.2        0.16666667]]
[[0.         1.         1.41421356]
 [1.73205081 2.         2.23606798]]
2.5
5
0
1.707825127659933
2.9166666666666665
15 [3 5 7]
[1 2 3 4 5 6]