大綱¶
- 為什麼需要
Numpy? Numpy的開始Numpy常用屬性與方法- 再談
reshape resize函數Numpy取值基礎- 軸與塑形
- 再談軸
為什麼需要Numpy?¶
python內建記憶體配置element wise即時性運算
為什麼需要Numpy(python內建記憶體配置)¶

In [3]:
# 範例(計算年薪)
import numpy as np
month_salary = [40000, 28000, 45000, 48000, 38000]
year_salary_normal = []
# 方法一(normal)
for i in month_salary:
year_salary_normal.append(i*12)
print("傳統方法:", year_salary_normal)
# 方法二(lambda)
year_salary_lambda = []
year_salary_lambda = list(map(lambda i:i*12, month_salary))
print("匿名函數:", year_salary_lambda)
#方法三(list comprehension)
year_salary_listcomprehension = [i*12 for i in month_salary]
print("list comprehension:", year_salary_listcomprehension)
#方法四(Numpy)
year_salary_numpy = np.array(month_salary)*12
print("numpy:", year_salary_numpy)
傳統方法: [480000, 336000, 540000, 576000, 456000] 匿名函數: [480000, 336000, 540000, 576000, 456000] list comprehension: [480000, 336000, 540000, 576000, 456000] numpy: [480000 336000 540000 576000 456000]
Numpy的開始¶
import numpy as np
ndarray_Variable = np.array(data, dtype='')
# dtype:int/float/bool/string(Unicode)
# ndarray所儲存的資料必須為相同資料型態
In [22]:
# 範例
import numpy as np
int_ndarray = np.array([14, 21, 30, 12, 10], dtype='int')
print("int ndarray:", int_ndarray)
print("int ndarray data type:", int_ndarray.dtype)
print("- - - - - - - - - ")
float_ndarray = np.array([14, 21, 30, 12, 10], dtype='float')
print("float ndarray:", float_ndarray)
print("float ndarray data type:", float_ndarray.dtype)
print("- - - - - - - - - ")
bool_ndarray = np.array([14, 21, 30, 12, 10], dtype='bool')
print("bool ndarray:", bool_ndarray)
print("bool ndarray data type:", bool_ndarray.dtype)
print("- - - - - - - - - ")
string_ndarray = np.array([14, 21, 30, 12, 10], dtype='U32')
print("string ndarray:", string_ndarray)
print("string ndarray data type:", string_ndarray.dtype)
int ndarray: [14 21 30 12 10] int ndarray data type: int64 - - - - - - - - - float ndarray: [14. 21. 30. 12. 10.] float ndarray data type: float64 - - - - - - - - - bool ndarray: [ True True True True True] bool ndarray data type: bool - - - - - - - - - string ndarray: ['14' '21' '30' '12' '10'] string ndarray data type: <U32
請問在建構ndarray時dtype 是否一定要寫?¶
In [ ]:
# 請猜猜以下結果
import numpy as np
int_ndarray = np.array([14, 21, 30, 12, 10]) ## 不設定dtype
print("int_ndarray:", int_ndarray)
print("int_ndarray data type:", int_ndarray.dtype)
請問在建構ndarray時data中的元素一定要是相同資料型態嗎?¶
In [ ]:
# 請猜猜以下結果
import numpy as np
ndarray = np.array([14, True, 30, 10])
print("ndarray:", ndarray)
print("ndarray data type:", ndarray.dtype)
ndarray注意事項¶
numpy強弱型別轉換string>float>int>bool
Numpy常用屬性與方法¶
- 屬性
- 維度
ndim - 形狀
shape - 大小
size
- 維度
- 重新塑形
- 重塑
reshape
- 重塑
In [ ]:
## 請猜猜以下執行結果
import numpy as np
my_list = [10, 11, 12.5, 8, 7, False]
my_ndarray = np.array(my_list)
print("my_ndarray 型態:", type(my_ndarray))
print("my_ndarray 資料型態:", my_ndarray.dtype)
print("my_ndarray 資料:", my_ndarray)
print("my_ndarray 維度:", my_ndarray.ndim)
print("my_ndarray 形狀:", my_ndarray.shape)
print("my_ndarray 大小:", my_ndarray.size)
print("- - - - - - - -")
my_ndarray.reshape(3,2)
print("my_ndarray 資料:", my_ndarray)
print("my_ndarray 維度:", my_ndarray.ndim)
print("my_ndarray 形狀:", my_ndarray.shape)
print("my_ndarray 大小:", my_ndarray.size)
my_ndarray.reshape(2,2)
print("my_ndarray 資料:", my_ndarray)
print("my_ndarray 維度:", my_ndarray.ndim)
print("my_ndarray 形狀:", my_ndarray.shape)
print("my_ndarray 大小:", my_ndarray.size)
In [ ]:
## 請猜猜以下執行結果
import numpy as np
my_list = [10, 11, '12', 8, 7, False]
ndarray_one = np.array(my_list)
print(ndarray_one)
ndarray_two = ndarray_one.reshape(2, 3)
print(ndarray_two)
ndarray_two[0][0] = 100
print(ndarray_two)
print(ndarray_one)
再談reshape¶
reshape的形狀可使用-1, -1表示模糊指定- 如:
ndarray_variable.reshape(n, -1)
- 如:
In [37]:
##範例
import numpy as np
my_list = [10, 11, 12, 13, 14, 15]
ndarray_one = np.array(my_list).reshape(3, 2)
print(ndarray_one.shape)
ndarray_one = np.array(my_list).reshape(-1, 2)
print(ndarray_one.shape)
ndarray_one = np.array(my_list).reshape(3, -1)
print(ndarray_one.shape)
(3, 2) (3, 2) (3, 2)
In [ ]:
##請猜猜以下執行結果
import numpy as np
my_list = [10, 11, 12, 13, 14, 15, 1, 2]
ndarray_one = np.array(my_list).reshape(-1, 8)
print(ndarray_one.shape)
ndarray_one = np.array(my_list).reshape(-1, 6)
print(ndarray_one.shape)
ndarray_one = np.array(my_list).reshape(-1, -1)
print(ndarray_one.shape)
練習¶
- 請建構
ndarray, 並嘗試使用模糊指定
resize方法¶
np.resize(ndarray_variable, 形狀)
In [50]:
## 範例
import numpy as np
print("reshape")
my_list = np.array([1, 2, 3, 4, 5, 6])
my_list_reshape1 = my_list.reshape(2, 3)
print(my_list_reshape1.shape)
print(my_list_reshape1)
print("- - - - - - ")
my_list_reshape2 = np.reshape(my_list, (2, 3))
print(my_list_reshape2.shape)
print(my_list_reshape2)
print("- - - - - - - - - - - - -")
print("ndarray = ", my_list)
print("resize")
my_list_resize2 = np.resize(my_list, (2, 3))
print(my_list_resize2.shape)
print(my_list_resize2)
reshape (2, 3) [[1 2 3] [4 5 6]] - - - - - - (2, 3) [[1 2 3] [4 5 6]] - - - - - - - - - - - - - ndarray = [1 2 3 4 5 6] resize (2, 3) [[1 2 3] [4 5 6]]
In [54]:
## 範例
import numpy as np
my_list = np.array([11, 12, 35, 42, 53, 61])
my_list_resize1 = np.resize(my_list, (2, 2))
print(my_list_resize1)
print("- - - - - -")
my_list_resize1 = np.resize(my_list, (2, 4))
print(my_list_resize1)
print("- - - - - -")
my_list_reshape1 = np.reshape(my_list, (2, 2))
print(my_list_reshape1)
[[11 12] [35 42]] - - - - - - [[11 12 35 42] [53 61 11 12]] - - - - - -
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-54-2f4d24fae7a6> in <module> 9 print(my_list_resize1) 10 print("- - - - - -") ---> 11 my_list_reshape1 = np.reshape(my_list, (2, 2)) 12 print(my_list_reshape1) <__array_function__ internals> in reshape(*args, **kwargs) /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/numpy/core/fromnumeric.py in reshape(a, newshape, order) 297 [5, 6]]) 298 """ --> 299 return _wrapfunc(a, 'reshape', newshape, order=order) 300 301 /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds) 56 57 try: ---> 58 return bound(*args, **kwds) 59 except TypeError: 60 # A TypeError occurs if the object does have such a method in its ValueError: cannot reshape array of size 6 into shape (2,2)
練習¶
- 請自行練習
resize與reshape, 並觀察其差異
In [ ]:
##請猜猜以下執行結果
import numpy as np
my_list = np.arange(10)
my_list_resize = my_list.resize(2, 4)
print(my_list_resize)
In [ ]:
##請猜猜以下執行結果
import numpy as np
my_list = np.arange(6)
print(my_list)
my_list_resize = np.resize(my_list, (3, 2))
my_list_resize[0][0] = 100
print(my_list_resize)
print("- - - - - -")
print(my_list)
練習¶
- 請再對於
resize自行進行練習
Numpy取值基礎¶
- 索引值
- 切片
In [48]:
#索引
import numpy as np
my_ndarray = np.array([[np.random.randint(1,10) for j in range (2)] for i in range (3)])
print("my_ndarray 資料:",my_ndarray)
## 請猜猜以下執行結果
print(my_ndarray[0][0])
print(my_ndarray[-1, -1])
my_ndarray 資料: [[3 8] [4 1] [9 1]]
In [70]:
## 切片
import numpy as np
my_ndarray = np.array([57, 43, 79, 32, 79, 14])
print("my_ndarray 資料:", my_ndarray)
print("- - - - - - - - - -")
## 請猜猜以下執行結果
print(my_ndarray[::2])
print(my_ndarray[::-1])
print(my_ndarray[-1::-2])
print(my_ndarray[-1:-3:])
print("- - - - - - - - - - - - - - - - - - - -")
my_ndarray = my_ndarray.reshape(2, 3)
print("my_ndarray 資料:\n", my_ndarray)
print("- - - - - - - - - -")
## 請猜猜以下執行結果
print(my_ndarray[::2][0][::2])
print(my_ndarray[::2, ::2])
print(my_ndarray[::2][::2])
my_ndarray 資料: [57 43 79 32 79 14] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - my_ndarray 資料: [[57 43 79] [32 79 14]] - - - - - - - - - -
In [ ]:
## 請猜猜以下執行結果
import numpy as np
num1 = np.array([57, 43, 79, 32, 79, 14])
num2 = num1
num1[0] = 100
print(num2)
num1.append(10)
print(num2)
練習¶
- 請自行建構一個
ndarray, 並練習取值
軸與塑形¶
axis- 常搭配函數
concatenate()split()
In [ ]:
## 請猜猜以下執行結果
import numpy as np
x = np.array([0, 1, 2, 3]).reshape(2,2)
y = np.array([4, 5, 6, 7]).reshape(2,2)
c1 = np.concatenate([x, y])
print("concatenate = ",c1, sep="\n")
c2 = np.concatenate([x, y], axis=0)
print("axis0 = ",c2, sep="\n")
c3 = np.concatenate([x, y], axis=1)
print("axis1 = ", c3, sep="\n")
In [18]:
import numpy as np
n1 = np.array([1,2,3,4,5,6,7,8,9]).reshape((3,3))
print("原始資料狀況 = \n", n1)
## 請猜猜以下執行結果
sp1_n1, sp1_n2 = np.split(n1, [2], axis=0)
print("axis=0分割的第一個陣列:", sp1_n1, sep="\n")
print("axis=0分割的第二個陣列:", sp1_n2, sep="\n")
print("- - - - - - - - - - -")
sp2_n1, sp2_n2 = np.split(n1, [1], axis=1)
print("axis=1分割的第一個陣列:", sp2_n1, sep="\n")
print("axis=1分割的第二個陣列:", sp2_n2, sep="\n")
原始資料狀況 = [[1 2 3] [4 5 6] [7 8 9]]
再談axis¶
In [ ]:
## 請猜猜以下執行結果
import numpy as np
ndarray = np.array([1, 2, 3, 4]).reshape(2, -1)
print(ndarray)
print(ndarray.sum())
print(ndarray.sum(axis=0))
print(ndarray.sum(axis=1))
In [ ]:
## 請猜猜以下執行結果
import numpy as np
num = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(np.sum(num, axis=0))
print(np.sum(num, axis=1))
axis軸的撰寫把握一個原則「越外層的數字越小」¶
上述範例圖解 - 一維ndarray¶

In [ ]:
## 請猜猜以下執行結果
import numpy as np
ndarray = np.array([1, 2, 3, 4, 5, 6]).reshape(2, 3)
print(ndarray)
print("- - - - - ")
print(ndarray.sum())
print("- - - - - ")
print(ndarray.sum(axis=0))
print("- - - - - ")
print(ndarray.sum(axis=1))
上述圖解 - 二維ndarray¶

In [ ]:
## 請猜猜以下執行結果
import numpy as np
ndarray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]).reshape(2, 3, 2)
print(ndarray)
print("- - - - - ")
print(ndarray.sum())
print("- - - - - ")
print(ndarray.sum(axis=0))
print("- - - - - ")
print(ndarray.sum(axis=1))
print("- - - - - ")
print(ndarray.sum(axis=2))
上述圖解 - 三維ndarray¶

可否有四維的ndarray? 如果有會有哪些個軸?¶
練習¶
- 請自行練習軸的合併與分割, 並觀察其結果