# -*- coding: utf-8 -*- """ 主要記錄代碼,相關說明採用註釋形勢,供日常總結、查閱使用,不定時更新。 Created on Mon Aug 20 23:37:26 2018 @author: Dev """ import numpy as np from datetime ...
# -*- 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'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x00@', 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'))