寫在前面
代碼中的np表示的是numpy,因爲導入的時候是:import numpy as np
一、數據分析與Numpy
1、數據分析
MATLAB:專業化數據分析工具
Numpy:更簡單上手,且結合了MATLAB大部分功能
2、Numpy介紹
- 應用於數值分析領域的Python語言工具
- 是一個開源的科學計算庫
- 彌補了作爲通用編程語言的Python在數值計算方面能力弱、速度慢的不足
- 擁有豐富的數學函數、強大的多位數組和優異的運算性能
- 與Scipy、scikit、matplotlib等其他科學計算庫可以很好協調
- 可以取代matlab等工具,允許用戶進行快速開發的同時完成交互式的原型設計
3、Numpy的效率
可以清楚看到,使用Numpy計算的效率是普通python語句計算的近60倍,這裏使用的是微秒(10的-6次方)
4、練習代碼
import datetime as dt
import numpy as np
n = 100000
start = dt.datetime.now()
A, B = [], [] # 兩個空列表
for i in range(n):
A.append(i ** 2) # 計算i的平方
B.append(i ** 3) # 計算i的3次方
C = []
# 用zip拉鍊拉起來就可以同時遍歷兩個列表
for a, b in zip(A, B):
C.append(a + b)
print("直接:", (dt.datetime.now() - start).microseconds) # 輸出直接用py語句來實現計算的運行時間
# 使用Numpy來實現
start = dt.datetime.now()
C = np.arange(n) ** 2 + np.arange(n) ** 3
print("Numpy:", (dt.datetime.now() - start).microseconds)
二、多維數組
1、多維數組
數組:空間上內存連續,元素同類型
Numpy中的數組:是numpy.ndarray這個類實例化來的對象,用於表示數據結構中的
任意維度的數組(ndarray表示數組名)
2、創建多維數組對象
- numpy.arange(起始,終止,步長)
- numpy.array:被解釋爲數組的容器
- ndarray.dtype屬性:表示元素的數據類型,astype()方法可以修改元素類型(ndarray表示數組名)
- ndarray.shape屬性:表示數組的維度,reshapre()方法可以改變維數,如
b = np.arange(1, 25).reshape(2, 3, 4)
- 元素索引:數組[頁索引][行索引][列索引];數組[頁索引,行索引,列索引]
3、練習代碼
import numpy as np
a = np.arange(1,10,2)
print(a)
# 一維數組裏面放入一個列表
b = np.array([2,4,6,8,10])
print(b)
# 二維數組裏面放入兩個一維列表
c = np.array([[1,3,5,7,9],
[2,4,6,8,10]])
print(c)
d = np.array(['1','2','3'])
# 查看數組類型,查看元素類型
print(c.dtype)
print(type(c))
print(type(c[0][3]))
print(type(d[1]))
# 給數組指定類型
e = np.array(['1','2','3'], dtype=np.int32)
print(type(e[0]))
f = e.astype(np.str)
print(type(f[0]))
# 查看數組的維度
print(c.shape)
# 創建一個2*3*4的數組,一個[]就是一個維度
# 最內部arange()又代表一個維度,因此是三維
g = np.array([
[np.arange(1,5), np.arange(2,6), np.arange(3,7)],
[np.arange(2,6), np.arange(7,11), np.arange(12,16)]
])
print(g.shape)
print(g.shape[0]) # 輸出數組的頁數,2*3*4,所以是2頁
print(g)
# 遍歷每個索引下的元素
h = np.array([
[
[1,2],[3,4]
],
[
[5,6],[7,8]
]
])
# shape[0]代表頁數,1代表行數,2代表列數……以此類推
for i in range(h.shape[0]):
for j in range(h.shape[1]):
for k in range(h.shape[2]):
print(h[i,j,k])
三、Numpy的數據類型
1、numpy的內置類型
bool_:1字節布爾型
int8:1字節,有符號整型(正負),-128~127
int16:2字節,有符號整型(正負)
uint8:1字節無符號整型,0~255
uint64:8字節無符號整型
float16:2字節浮點型
float64:8字節浮點型
complex64:8字節複數型
complex128:16字節複數型
str_:字符串型
2、自定義類型
通過dtype將多個相同或者不同的numpy內置類型組合成某種複合類型
除了使用內置類型的全稱(後面的數字代表位數),還可以通過類型編碼字符串(後面的數字代表字節數,1字節=8位)來簡化類型的說明
- numpy.int8——>i1
- numpy.nint32——>u4
- numpy.float64——>f8
- numpy.complex128——>c16
- numpy.str_——>U字符數
- numpy.bool_——>b
3、字節序
對於多字節的整數可以加上 字節序 前綴:
<:小端字節序,低數位低地址,前高後低
>:大端字節序,低數位高地址,前低後高
=:處理器(CPU)系統默認
<:0x1234
L | H |
0x34 | 0x12 |
>:0x1234
L | H |
0x12 | 0x34 |
4、練習代碼
import numpy as np
a = np.array([('abc',[1,2,3,4,5])],dtype='U3, 5i4')
# U3, 5i4表示一個新的類型,3個字符長度的字符串,5個4字節大小的int類型
# 訪問各個字符,用默認字段名f:['f0'],['f1'],['f2']……
# print(a[0]['f0']) # 訪問到abc
# print(a[0]['f1']) # 訪問到數字
# print(a[0]['f0'][1]) # 訪問b
# print(a[0]['f1'][2]) # 訪問3
# 自定義 字段名:字段名,類型(全稱),字符數/字節大小
b = np.array([('abc',[1,2,3,4,5])],
dtype=[('ss', np.str, 3), ('ii', np.int, 5)])
# 使用自定義字段名來訪問
# print(b[0]['ss']) # 訪問到abc
# print(b[0]['ii']) # 訪問到數字
# print(b[0]['ss'][1]) # 訪問b
# print(b[0]['ii'][2]) # 訪問3
# 第三種方式:既可以自定義字段名,又可以使用類型簡稱
c = np.array([('abc',[1,2,3,4,5])],dtype={
"names":['ss', 'ii'],
"formats":['U3', '5i4'],
})
# 使用自定義字段名來訪問
# print(c[0]['ss']) # 訪問到abc
# print(c[0]['ii']) # 訪問到數字
# print(c[0]['ss'][1]) # 訪問b
# print(c[0]['ii'][2]) # 訪問3
# 第四種方式:類型後面跟內存偏移量,也是既可以自定義字段名,又可以使用類型簡稱
d = np.array([('abc',[1,2,3,4,5])],dtype={
"ss":('U3', 0),
"ii":('5i4', 12)
})
# 使用自定義字段名來訪問
# print(d[0]['ss']) # 訪問到abc
# print(d[0]['ii']) # 訪問到數字
# print(d[0]['ss'][1]) # 訪問b
# print(d[0]['ii'][2]) # 訪問3
# 字節偏移量
# 同時擁有兩個類型:一個u2,一個u1,u1的one偏移量爲0,two偏移量爲1
# >表示是大端字節序,前低後高,偏移量爲0則是的低的,即12;偏移量爲1則是高的,即34
e = np.array([0x1234], dtype=(
'>u2',{'one':('u1',0), 'two':('u1',1)}
))
print('{:x}'.format(e[0])) # {:x}表示以16進制訪問,e[0]表示第一個類型u2
print('{:x}、{:x}'.format(e['one'][0],e['two'][0]))
# 改爲小端字節序,前高後低,偏移量爲0則是的低的,即34;偏移量爲1則是高的,即12
e = np.array([0x1234], dtype=(
'<u2',{'one':('u1',0), 'two':('u1',1)}
))
print('{:x}、{:x}'.format(e['one'][0],e['two'][0]))