Python之數據分析(Numpy的使用、多維數組、數據類型)

寫在前面

代碼中的np表示的是numpy,因爲導入的時候是:import numpy as np

一、數據分析與Numpy

1、數據分析
MATLAB:專業化數據分析工具
Numpy:更簡單上手,且結合了MATLAB大部分功能

2、Numpy介紹

  • 應用於數值分析領域的Python語言工具
  • 是一個開源的科學計算庫
  • 彌補了作爲通用編程語言的Python在數值計算方面能力弱、速度慢的不足
  • 擁有豐富的數學函數、強大的多位數組和優異的運算性能
  • 與Scipy、scikit、matplotlib等其他科學計算庫可以很好協調
  • 可以取代matlab等工具,允許用戶進行快速開發的同時完成交互式的原型設計

3、Numpy的效率
11
可以清楚看到,使用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]))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章