Numpy基礎學習(一)
Numpy基礎學習
本文主要內容來自《Python數據分析基礎教程 NumPy學習指南》第二版,建議直接閱讀該書。
import numpy as np
#創建一維數組
a = np.arange(5)
print(a)#[0 1 2 3 4]
print(a.dtype)#int64
print(a.shape)#(5,);shape屬性返回一個元組(tuple),元組中的每個元素代表一個維度上的大小。
#創建多維數組
m = np.array([np.arange(3),np.arange(3),np.arange(3)])
print(m)#[[0 1 2][0 1 2] [0 1 2]]
print(m.shape)#(3 3 3)
#選取數組元素
#嵌套的列表
print(m[0,0])#0
#Numpy數據類型及轉化函數
#float16,float32,float64或float,inti,int8,int16,int32,int64,uint8,uint16,uint32,uint64,,bool,complex64,complex128或complex
#複數是不能轉換成整數,浮點數,會觸發TypeError;但浮點數可以轉換爲複數列如,complex(1.0)
#單個元素在內存中佔用的字節數
print(a.dtype.itemsize)#8
#字符編碼 整數i,無符號整數u,單精度浮點數f,雙精度浮點數d,布爾值b,複數D,字符串str,unicode字符串U,void(空)V
f = np.arange(7,dtype='f')
print(f)#[0. 1. 2. 3. 4. 5. 6.]
s = f.astype('str')
print(s)#['0.0' '1.0' '2.0' '3.0' '4.0' '5.0' '6.0']
#自定義數據類型數組
t = np.dtype([('name','str',40),('numitems', 'int32'),('price','float32')])
print(t)
itemz = np.array([('M',42,3.14),('b',13,2.72)],dtype=t)
print(itemz[1])#('b', 13, 2.72)
#一維數組的索引和切片
a = np.arange(9)
#用下標3-7來選取元素3-6
b = a[3:7]
print(a,b)#[0 1 2 3 4 5 6 7 8] [3 4 5 6]
#用下標0-7,以2爲步長選取元素
print(a[:7:2])#[0 2 4 6]
#用負數下標翻轉數組
print(a[::-1])#[8 7 6 5 4 3 2 1 0]
#多維數組的切片和索引
b = np.arange(24).reshape(2,3,4)
print(b)
'''
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
用三維數組b,來表示樓層,行,列
'''
#選取所有樓層的第一行,第一列
print(b[:,0,0])#[ 0 12]
#選取第一層
print(b[0])
#或
print(b[0,:,:])
#或
print(b[0,...])
'''[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
'''
#將第一樓層第2排的進行切片
print(b[0,1])#[4 5 6 7]
print(b[0,1,::2])#[4 6]
print(b[0,1,::3])#[4 7]
print(b[0,1,:2])#[4 5]
#不指定樓層,獲取第2列的房間
print(b[...,1])
print(b[:,1])
'''[[ 4 5 6 7]
[16 17 18 19]]
'''
#獲取第一層樓,所有位於第二列的房間
print(b[0,:,1])#[1 5 9]
#獲取第一層樓,所有位於最後一列的房間
print(b[0,:,-1])#[ 3 7 11]
#反向選取第一層樓最後一列的所有房間
print(b[0,::-1,-1])#[11 7 3]
print(b[0,::2,-1])#[ 3 11]
#改變數組的維度
#使用ravel函數展平數組,不會保存結果,返回數組的一個視圖
print(b.ravel())#[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
print(b)
''' [[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
'''
#使用flatten函數展平數組,會保存結果
print(b.flatten())
print(b)
#用元組設置維度,reshape設置維度,resize(會直接修改所操作的數組)
b.shape = (6,4)
print(b)
'''[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
'''
print(b.reshape(6,4))
'''[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
'''
# print(b.resize(2,12))
# print(b)
'''
[[ 0 1 2 3 4 5 6 7 8 9 10 11]
[12 13 14 15 16 17 18 19 20 21 22 23]]
'''
#transpose 轉置矩陣在線性代數中,操作很常見
# print(b.transpose())
'''[[ 0 4 8 12 16 20]
[ 1 5 9 13 17 21]
[ 2 6 10 14 18 22]
[ 3 7 11 15 19 23]]
'''
#數組的組合,包括水平組合,垂直組合和深度組合方式,將使用vstack,dstack,hstack column_stack,row_stack 以及concatenate函數完成數組的組合
#創建數組
a = np.arange(9).reshape(3,3)
b = 2 * a
# print(a,b)
'''
[[0 1 2]
[3 4 5]
[6 7 8]]
[[ 0 2 4]
[ 6 8 10]
[12 14 16]]
'''
#水平組合hstack,concatenate
print(np.hstack((a,b)))
print(np.concatenate((a,b),axis=1))
'''
[[ 0 1 2 0 2 4]
[ 3 4 5 6 8 10]
[ 6 7 8 12 14 16]]
'''
#垂直組合
print(np.vstack((a,b)))
print(np.concatenate((a,b),axis=0))
'''
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 0 2 4]
[ 6 8 10]
[12 14 16]]
'''
#深度組合,將一系列數組沿縱軸方向層疊組合
print(np.dstack((a,b)))
'''
[[[ 0 0]
[ 1 2]
[ 2 4]]
[[ 3 6]
[ 4 8]
[ 5 10]]
[[ 6 12]
[ 7 14]
[ 8 16]]]
'''
#列組合column_stack對於一維數組按列的方向組合,二維數組和hstack 效果一樣。
oned = np.arange(2)
twice = 2*oned
print(np.column_stack((oned,twice)))
'''
[[0 0]
[1 2]]
'''
print(np.column_stack((a,b)))
'''
[[ 0 1 2 0 2 4]
[ 3 4 5 6 8 10]
[ 6 7 8 12 14 16]]
'''
#row_stack對於一維數組行組合直接疊加,二維數組和vstack效果相同。
print(np.row_stack((oned,twice)))
'''
[[0 1]
[0 2]]
'''
#數組的分割hsplit,vsplit,dsplit,split
print(a)
'''
[[0 1 2]
[3 4 5]
[6 7 8]]
'''
print(np.hsplit(a,3))
print(np.split(a,3,axis=1))
'''
[array([[0],
[3],
[6]]),
array([[1],
[4],
[7]]),
array([[2],
[5],
[8]])]
'''
#垂直分割
print(np.vsplit(a,3))
print(np.split(a,3,axis=0))
'''
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
'''
#深度分割dsplit函數將深度方向分割數組。
c = np.arange(27).reshape(3,3,3)
print(c)
'''
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
'''
print(np.dsplit(c,3))
'''
[array([[[ 0],
[ 3],
[ 6]],
[[ 9],
[12],
[15]],
[[18],
[21],
[24]]]), array([[[ 1],
[ 4],
[ 7]],
[[10],
[13],
[16]],
[[19],
[22],
[25]]]), array([[[ 2],
[ 5],
[ 8]],
[[11],
[14],
[17]],
[[20],
[23],
[26]]])]
'''
#數組的屬性
#ndim數組的維數,或數組的軸的個數
print(b.ndim)#2
#size 元素的總個數
print(b.size)#9
#元素在內存中所佔的字節數
print(b.itemsize)#8
#數組佔的存儲空間
print(b.nbytes)#72
#T屬性的效果和transpose函數一樣
#real 輸出複數數組的實部
#imag 輸出數組的虛部
#flat返回一個numpy.flatiter對象
#數組的轉換tolist()
print(b.tolist())#[[0, 2, 4], [6, 8, 10], [12, 14, 16]]
#astype轉換數組時指定數據類型
print(b.astype(int))
'''
[[ 0 2 4]
[ 6 8 10]
[12 14 16]]
'''