Python Basic | Numpy 複習¶

Da-Wei Chiang¶

大綱¶

  • 為什麼需要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]]

reshape與resize的差異在於¶

若reshape指定的形狀不存在則會產生Error, resize則會自動充值¶

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與reshape最主要差異的重要概念.¶

resize會建構一個新的物件實體, reshape會參照相同的記憶體物件¶

練習¶

  • 請再對於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? 如果有會有哪些個軸?¶

練習¶

  • 請自行練習軸的合併與分割, 並觀察其結果