# -*- coding: utf-8 -*-
“””
主要記錄程式碼,相關說明採用註釋形勢,供日常總結、查閱使用,不定時更新。
Created on Mon Aug 20 23:37:26 2018
@author: Dev
“””
import numpy as np
from datetime import datetime
import random
對a,b兩個列表的相同位的元素進行運算求和:
# 純Python def pythonSum(n): # 對列表迴圈計算 a = [x for x in range(n)] b = [x for x in range(n)] c = [] for i in range(len(a)): a[i] = i ** 2 b[i] = i ** 3 c.append(a[i] +b[i]) return c
# numpy def numpySum(n): # 直接對陣列操作 a = np.arange(n) ** 2 b = np.arange(n) ** 3 c = a + b return c
# 效率比較 size = 1000 # pythonSum() start = datetime.now() # 起始時間 c = pythonSum(size) delta = datetime.now() - start # pythonSum()的執行時間 print("The last two elements: ", c[-2:]) # 列印最後兩個元素,確認準確性 print("PythonSum elapsed time in microseconds: ", delta.microseconds) # 以微秒為單位顯示執行時間
# pythonSum結果 The last two elements: [995007996, 998001000] PythonSum elapsed time in microseconds: 999
# numpySum() start = datetime.now() c = numpySum(size) delta = datetime.now() - start print("The last two elements: ", c[-2:]) print("NumpySum elapsed time in microseconds: ", delta.microseconds)
# numpySum結果 The last two elements: [995007996 998001000] NumpySum elapsed time in microseconds: 0
可以看出使用numpy陣列的速度超快~
numpy陣列
a = np.arange(5)
print(a.dtype)
多維陣列
m = np.array([np.arange(2), np.arange(2)]) # 建立一個二維陣列
print(m)
# 建立元素為0的陣列
zeros = np.zeros(10)
zeros_2 = np.zeros((3, 6)) # 元素為0的3*6陣列
# 建立元素隨機(empty)的陣列
empty = np.empty((2, 3, 2))
# 訪問陣列元素
a = np.array(([1, 2], [3, 4]))
print(a[0, 0])
print(a[0, 1])
print(a[1, 0])
print(a[1, 1])
陣列元素的資料型別
print(np.float64(42)) # float浮點型
print(np.float(True))
print(np.float(False))
print(np.int8(42.0)) # int整型
print(np.bool(42)) # Boolean布林型
print(np.bool(0))
print(np.bool(42.0))
# 建立陣列時定義元素的資料型別
print(np.arange(7, dtype=np.uint16))
print(np.arange(9, dtype=np.float64))
資料型別轉換
# 型別轉換時出現的TypeError異常
try:
print(np.int(42.0 + 1.j))
except TypeError:
print(“TypeError: can`t convert complex to int!”)
arr = np.array([1, 2, 3, 4, 5])
print(arr.dtype) # 元素型別
float_arr = arr.astype(np.float64)
print(float_arr.dtype)
arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
print(arr.dtype)
int_arr = arr.astype(np.int32) # 將float64型別轉換為int32型別
# 將字串陣列轉換為字元型
numeric_string = np.array([`1.25`, `-9.6`, `42`], dtype=np.string_)
print(numeric_string.astype(float)) # 再轉換為float型別
字元編碼
print(np.arange(7, dtype=`f`)) # float32
print(np.arange(7, dtype=`d`)) # float64
print(np.arange(7, dtype=`D`)) # complex128
print(np.dtype(float))
print(np.dtype(`f`))
print(np.dtype(`d`))
print(np.dtype(`F`))
print(np.dtype(`D`))
print(np.dtype(`f8`))
print(np.dtype(`float64`))
# dtype類的屬性
t = np.dtype(`float64`)
print(t.char) # 字元編碼
print(t.type) # t的型別
print(t.str)
自定義資料型別
# [(欄位1, 型別, 長度), (欄位2, 型別, 長度), …]
t = np.dtype([(`name`, np.str_, 40), (`numitems`, np.int32), (`price`, np.float32)])
print(t)
print(t.name)
itemz = np.array([(`Meaning of life DVD`, 42, 100), (`Butter`, 13, 2.72)]) # 按照格式生成陣列
陣列與標量的計算
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr * arr) # 對應位的元素相乘
print(arr – arr) # 對應位的元素相減
print(1 / arr) # 取倒數
print((arr ** 2) ** 0.5) # 平方後開根號
一維陣列的索引與切片(與列表切片用法相似)
a = np.arange(9)
print(a[3: 7])
print(a[:7:2]) # 從0到6,步長為2
s = slice(3, 7, 2) # 先設定切片位置及步長,再呼叫
print(a[s])
print(a[::-1]) # 倒序排列1
s = slice(None, None, -1) # 倒序排列2
print(a[s])
多維陣列的切片與索引
b = np.arange(24).reshape(2, 3, 4)
print(b.shape) # 陣列b的維數
# 使用索引與切片選取指定元素
print(b[0,0,0])
print(b[:,0,0])
print(b[0]) # 第一維的所有元素
print(b[0, :, :]) # 第一維的所有元素
print(b[0, …]) # 第一維的所有元素
print(b[0,1]) # 第一維第二行
print(b[0,1,::2]) # 以2為步長
print(b[…,1]) # 兩個維的第一列
print(b[:,1]) # 兩個維的第一行
print(b[0,:,1]) # 第一維第一列
print(b[0,:,-1]) # 第一維最後一列
print(b[0,::-1, -1]) # 第一維最後一列的倒序排列
print(b[0,::2,-1]) # 第一維的第0行和第2行的最後一個元素
print(b[::-1]) # 兩個維倒序
s = slice(None, None, -1) # 所有元素倒序排列
print(b[(s, s, s)])
布林型索引(mask)
names = np.array([`Bob`, `Joe`, `Will`, `Bob`, `Will`, `Joe`, `Joe`])
random.seed(200) # 設定隨機種子
data = np.random.random((7, 4))
print(names == `Bob`) # 生成布林型mask
print(data[names == `Bob`]) # 根據mask的值匹配data陣列中的元素
print(data[names == `Bob`, 2:]) # 匹配值從第三列到最後一列的元素
print(data[names == `Bob`, 3]) # 匹配值第四列的元素
names != `Bob`
data[~(names == `Bob`)]
mask = (names == `Bob`) | (names == `will`) # 或運算子
data[mask]
data[data < 0] = 0
data[names != `Joe`] = 7
花式索引(索引亂序)
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
arr[[4, 3, 0, 6]] # 根據索引的順序取值
arr[[-3, -5, -7]]
arr = np.arange(32).reshape((8, 4))
arr[[1, 5, 7, 2], [0, 3, 1, 2]]
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]
陣列轉置
arr = np.arange(15).reshape((3, 5))
arr.reshape((5,3))
print(arr.T)
改變資料維度
b = np.arange(24).reshape((2, 3, 4))
print(b)
print(b.ravel()) # 將多維陣列將為一維
print(b.flatten())
b.shape = (6, 4)
print(b)
print(b.transpose())
b.resize((2, 12))
print(b)
注: flatten()與ravel()的區別
# 當修改ravel()返回的值時,會影響原陣列;而flatten則不會
arr_a = np.arange(4).reshape(2, 2)
arr_a.ravel()[-1] = 5
print(arr_a) # arr_a的最後一個元素已被修改
arr_a.flatten()[0] = 10
print(arr_a) # 不會影響原陣列的第一個元素
組合陣列
a = np.arange(9).reshape(3, 3)
print(a)
b = 2 * a
print(b)
# 水平組合
print(np.hstack((a, b)))
print(np.concatenate((a, b), axis=1))
# 豎直組合
print(np.vstack((a, b)))
print(np.concatenate((a, b), axis=0))
# 深度組合deep
print(np.dstack((a, b)))
# column_stack & row_stack(與hstack & vstack效果類似)
oned = np.arange(2)
print(oned)
twice_oned = 2 * oned
print(twice_oned)
print(np.column_stack((oned, twice_oned)))
print(np.column_stack((a, b)) == np.hstack((a, b)))
print(np.row_stack((oned, twice_oned)))
print(np.row_stack((a, b)))
print(np.row_stack((a, b)) == np.vstack((a, b)))
陣列的分割
a = np.arange(9).reshape(3, 3)
print(a)
# 從水平方向分成三列(跨列)
print(np.hsplit(a, 3))
print(np.split(a, 3, axis=1))
# 從豎直方向分成三行(跨行)
print(np.vsplit(a, 3))
print(np.split(a, 3, axis=0))
# 深度分割
c = np.arange(27).reshape(3, 3, 3)
print(c)
print(np.dsplit(c, 3))
陣列的屬性
b = np.arange(24).reshape(2, 12)
b.ndim # 維度
b.size # 元素個數
b.itemsize # 單個元素的大小
b.nbytes # 整個陣列的大小(itemsize * size)
# 複數
b = np.array([1.+1.j, 3.+2.j])
b.real # 實部
b.imag # 虛部
陣列的轉換
b = np.arange(4).reshape(2, 2)
b.flat # 將陣列轉換為一維陣列
for i in range(len(b.flat)): # 迴圈訪問陣列元素
print(b.flat[i])
b = np.array([1.+1.j, 3.+2.j])
print(b)
print(b.tolist()) # 轉換為list
print(b.tostring()) # 轉換為字元
# 使用np.fromstring將字串轉換為指定格式
print(np.fromstring(b`x00x00x00x00x00x00xf0?x00x00x00x00x00x00xf0?x00x00x00x00x00x00x08@x00x00x00x00x00x00x00@`, dtype=complex))
a_t = np.fromstring(`20:42:53`, sep=`:`, dtype=int)
print(a_t)
print(a_t.dtype)
# 複數轉換為整型時會捨棄虛部
print(b.astype(int))
print(b.astype(`complex`))