NumPy 1.14 教學 – #02 如何印出陣列以及格式設定(np.set_printoptions)
開始學NumPy之前至少先熟悉Python基礎使用方法,這樣再來看NumPy才不會那麼吃力!
Python3 教學、筆記本篇算是比較短篇幅的單元,在這將會說明該如何印出NumPy的陣列以及如何使用np.set_printoptions方法來設定列印格式!同時也會利用這個機會稍微使用一下reshape函數!
本文章的練習檔也有放在GitHub:Learn NumPy – GitHub
直接print( )
下列會給三種陣列預設列印出來的樣子,三種陣列分別是1維、2維、3維 。
在下列範例會使用到一個函數reshape( ),這個函數是用來對NumPy的陣列進行改變維度的工具!
np.reshape(<欲將陣列改變成維度的大小>):np.reshape(1, 2)表示要改成1-by-2的矩陣。
1維陣列
1 2 3 |
# 1維 a = np.arange(6) print(a) |
1 |
[0 1 2 3 4 5] |
2維陣列
1 2 3 |
# 2維 b = np.arange(12).reshape(2, 6) print(b) |
1 2 |
[[ 0 1 2 3 4 5] [ 6 7 8 9 10 11]] |
3維陣列
1 2 3 |
# 3維 c = np.arange(24).reshape(2,4,3) print(c) |
1 2 3 4 5 6 7 8 9 |
[[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] [[12 13 14] [15 16 17] [18 19 20] [21 22 23]]] |
NumPy列印有很多可自訂選項
np.set_printoptions( 列印選項 ):這是一個全域設定,以下會說明各個不同的選項代表的意義與控制的項目。
np.set_printoptions( threshold=元素門檻值 ):NumPy預設值是1000。意思是如果陣列元素值沒有超過門檻值的話,NumPy就會讓Python將所有元素列印出來!
當陣列元素數量到達一定量的時候,就可能會需要用到這個方法!
1 2 3 4 5 6 7 8 9 10 11 12 13 |
np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None) # reset print options ##threshold # 當要列印的陣列太大時,NumPy會自動以...代替一部分的內容,以減少篇幅! # 但是可以透過全域設定set_printoptions設定threshold(門檻值), # 元素數量少於或等於門檻值的陣列就會全部列印出來, # 相反地,元素數量高於門檻值,列印時就會省略部分內容。 # 陣列大小:20,門檻值20 => 陣列元素數量小於等於門檻值,應列印全部內容 np.set_printoptions(threshold=20) print("NumPy set_printoptions(threshold=20)\n", np.arange(20)) print() # 陣列大小:20,門檻值15 => 陣列元素數量大於門檻值,應省略部分內容 np.set_printoptions(threshold=15) print("NumPy set_printoptions(threshold=15)\n", np.arange(20)) |
1 2 3 4 5 |
NumPy set_printoptions(threshold=20) [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] NumPy set_printoptions(threshold=15) [ 0 1 2 3 4 ... 15 16 17 18 19] |
np.set_printoptions( precision=浮點數列印精度 ):控制陣列內容微幅點數時的列印精度(小數位數),下列範例看得出來這個方法是會自動四捨五入的喔!
1 2 3 4 5 6 7 |
np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None) # reset print options ## precision:控制陣列內容微幅點數時的列印精度(小數位數) np.set_printoptions(precision=1) print("NumPy set_printoptions(precision=1)\n", np.linspace(3, 5, 10)) print() np.set_printoptions(precision=3) print("NumPy set_printoptions(precision=3)\n", np.linspace(3, 5, 10)) |
1 2 3 4 5 |
NumPy set_printoptions(precision=1) [3. 3.2 3.4 3.7 3.9 4.1 4.3 4.6 4.8 5. ] NumPy set_printoptions(precision=3) [3. 3.222 3.444 3.667 3.889 4.111 4.333 4.556 4.778 5. ] |
np.set_printoptions( edgeitems=省略列印內容時要顯示的元素數量 ):當列印陣列時需要省略內容,edgeitems會決定要印出來的元素有幾個。
1 2 3 4 5 6 7 |
np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None) # reset print options ## edgeitems:當列印陣列時需要省略內容,edgeitems會決定要印出來的元素有幾個 np.set_printoptions(threshold=10, edgeitems=3) print("NumPy set_printoptions(edgeitems=3)\n", np.arange(15)) print() np.set_printoptions(threshold=10, edgeitems=5) print("NumPy set_printoptions(edgeitems=5)\n", np.arange(15)) |
1 2 3 4 5 |
NumPy set_printoptions(edgeitems=3) [ 0 1 2 ... 12 13 14] NumPy set_printoptions(edgeitems=5) [ 0 1 2 3 4 ... 10 11 12 13 14] |
np.set_printoptions( linewidth=每一行要印出幾個字元 ):這只是單純決定列印陣列時每一行字的字元數上限喔,並不影響列印其他內容的每一行字元數上限!
1 2 3 4 5 6 7 |
np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None) # reset print options ## linewidth np.set_printoptions(linewidth=10) print("NumPy set_printoptions(linewidth=10)\n", np.arange(15)) print() np.set_printoptions(linewidth=20) print("NumPy set_printoptions(linewidth=25)\n", np.arange(15)) |
1 2 3 4 5 6 7 8 9 10 11 |
NumPy set_printoptions(linewidth=10) [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] NumPy set_printoptions(linewidth=25) [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] |
np.set_printoptions( suppress=是否要抑制顯示小數位 ):其實這個我不太知道該怎麼解釋才夠完全,但我對這個功能的理解是用來“抑制顯示小數位數”,而預設值是False(代表不要抑制顯示小數位,就是通通給我顯示)。
1 2 3 4 5 6 7 |
np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None) # reset print options # suppress np.set_printoptions(suppress=True) print("NumPy set_printoptions(suppress=True)\n", np.arange(0, 1, 0.00001)) print() np.set_printoptions(suppress=False) print("NumPy set_printoptions(suppress=False)\n", np.arange(0, 1, 0.00001)) |
1 2 3 4 5 |
NumPy set_printoptions(suppress=True) [0. 0. 0. ... 1. 1. 1.] NumPy set_printoptions(suppress=False) [0.e+00 1.e-05 2.e-05 ... 1.e+00 1.e+00 1.e+00] |
np.set_printoptions( nanstr=當陣列元素值出現NaN時所顯示的字串 ):當陣列元素值出現not-a-number時要顯示的內容為何。沒錯,這個也可以改!
1 2 3 4 5 6 |
np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None) # reset print options ## nanstr # 當陣列元素值出現not-a-number時要顯示的內容為何 np.set_printoptions(nanstr="Oops!") a = np.array([np.nan, 1, np.nan], dtype=np.float16) print("NumPy set_printoptions(nanstr=\"Oops!\")\n", a) |
1 2 |
NumPy set_printoptions(nanstr="Oops!") [Oops! 1. Oops!] |
np.set_printoptions( infstr=當陣列元素值出現inf時所顯示的字串 ):當陣列元素值出現inf(無限大)時要顯示的內容為何。
1 2 3 4 5 6 |
np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None) # reset print options ## infstr # 當陣列元素值出現inf(無限大)時要顯示的內容為何 np.set_printoptions(infstr="∞") a = np.array([np.inf, 8, -np.inf]) print("NumPy set_printoptions(infstr=\"∞\")\n", a) |
1 2 |
NumPy set_printoptions(infstr="∞") [ ∞ 8. -∞] |
np.set_printoptions( sign=控制正負號 ):當sign=’+’時,就會連正數都會加上正號;當sign=’-‘時(預設值),就是只有數值<0時,才會加上負號!
1 2 3 4 5 6 7 8 9 10 11 |
np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None) # reset print options ## sign # 當sign='+'時,就會連正數都會加上正號 np.set_printoptions(sign='+') a = np.array([9, 8, -6, -7], dtype=np.float16) print("NumPy set_printoptions(sign=\"+\")\n", a) print() # 當sign='-'時(預設值),就是只有數值<0時,才會加上負號 np.set_printoptions(sign='-') a = np.array([9, 8, -6, -7], dtype=np.float16) print("NumPy set_printoptions(sign=\"-\")\n", a) |
1 2 3 4 5 |
NumPy set_printoptions(sign="+") [+9. +8. -6. -7.] NumPy set_printoptions(sign="-") [ 9. 8. -6. -7.] |
np.set_printoptions( formatter={ 使用lambda函數客製列印陣列元素的格式 } ):元素內容格式也能客製,甚至能在列印時改變數值呢!
型別關鍵字
all:各種型別都套用格式
float_kind:只套用floatxx
int_kind:只套用intxx
str_kind:只套用字串
除此之外,還有很多種型別的關鍵字!請參考技術文件:numpy.set_printoptions – SciPy.org
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None) # reset print options ## formatter # 使用lambda函數客製列印陣列元素的格式 np.set_printoptions() # reset print options np.set_printoptions(formatter={'all': lambda x: 'i:' + str(x)}) print("NumPy set_printoptions(formatter={all: i:})\n", np.arange(0,5)) print() # 這邊可以看出來,只設定了float的格式,是不會對int產生影響的 np.set_printoptions(formatter={'float_kind': lambda x: 'f:' + str(x)}) print("NumPy set_printoptions(formatter={float_kind: f:})\n", np.arange(0,5)) print("NumPy set_printoptions(formatter={float_kind: f:})\n", np.arange(0,5, dtype=np.float16)) print() # 如果同時只想要客製float和int的格式,可以用逗號隔開設定值 np.set_printoptions(formatter={'int_kind': lambda x: 'i:' + str(x), 'float_kind': lambda x: 'f:' + str(x)}) print("NumPy set_printoptions({int_kind: i:, float_kind: f:})\n", np.arange(0,5)) print("NumPy set_printoptions({int_kind: i:, float_kind: f:})\n", np.arange(0,5, dtype=np.float16)) |
1 2 3 4 5 6 7 8 9 10 11 12 |
NumPy set_printoptions(formatter={all: i:}) [i:0 i:1 i:2 i:3 i:4] NumPy set_printoptions(formatter={float_kind: f:}) [0 1 2 3 4] NumPy set_printoptions(formatter={float_kind: f:}) [f:0.0 f:1.0 f:2.0 f:3.0 f:4.0] NumPy set_printoptions({int_kind: i:, float_kind: f:}) [i:0 i:1 i:2 i:3 i:4] NumPy set_printoptions({int_kind: i:, float_kind: f:}) [f:0.0 f:1.0 f:2.0 f:3.0 f:4.0] |