numpy 簡介

 

 

 

 

In [227]:
import numpy as np
In [ ]:
# NumPy是Python中科學計算的基礎軟件包。
# 它是一個提供多了維數組對象,多種派生對象(如:掩碼數組、矩陣)以及用於快速操做數組的函數及API,
# 它包括數學、邏輯、數組形狀變換、排序、選擇、I/O 、離散傅立葉變換、基本線性代數、基本統計運算、隨機模擬等等。

# NumPy包的核心是ndarray對象。

# 它封裝了python原生的同數據類型的n維數組,爲了保證其性能優良,其中有許多操做都是代碼在本地進行編譯後執行的。

# NumPy數組 和 標準Python Array(數組) 之間 的區別
    # NumPy數組在建立時具備固定的大小,與Python的原生數組對象(能夠動態增加)不一樣。 更改ndarray的大小將建立一個新數組並刪除原來的數組。
    # NumPy數組中的元素都須要具備相同的數據類型,所以在內存中的大小相同。 例外狀況:Python的原生數組裏包含了NumPy的對象的時候,
    # 這種狀況下就容許不一樣大小元素的數組。
# 安裝

# python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
In [2]:
# NumPy的主要對象是同類型的多維數組。它是一張表,全部元素(一般是數字)的類型都相同,並經過正整數元組索引。在NumPy中,維度稱爲軸。
# 軸的數目爲rank。
# [1, 2, 1] 是rank爲1的數組,由於它具備一個軸。該軸的長度爲3
t1  = [[ 1., 0., 0.],
[ 0., 1., 2.]]
# t1 有兩個軸 第一個軸(維度)的長度爲2,第二個軸(維度)的長度爲3。
In [3]:
# 主要屬性

# ndarray.ndim:數組的軸(維度)的個數。在Python世界中,維度的數量被稱爲rank。
# ndarray.shape:數組的維度。這是一個整數的元組,表示每一個維度中數組的大小。對於有n行和m列的矩陣,shape將是(n,m)。所以,
#   shape元組的長度就是rank或維度的個數 ndim。
# ndarray.size:數組元素的總數。這等於shape的元素的乘積。
# ndarray.dtype:一個描述數組中元素類型的對象。可使用標準的Python類型建立或指定dtype。另外NumPy提供它本身的類型。
#   例如numpy.int3二、numpy.int16和numpy.float64。
# ndarray.itemsize:數組中每一個元素的字節大小。例如,元素爲 float64 類型的數組的 itemsize 爲8(=64/8),而 complex32 類型的數組的
#   itemsize 爲4(=32/8)。它等於 ndarray.dtype.itemsize 。
# ndarray.data:該緩衝區包含數組的實際元素。一般,咱們不須要使用此屬性,由於咱們將使用索引訪問數組中的元素。
In [50]:
# 建立數組
In [228]:
# 1. 用普通的python列表建立數組
a1 = np.array([1,2,3])
print(a1.ndim)
print(a1.dtype)
print(a1.size)
print(a1.shape)
a1
 
2
int32
3
(3, )
Out[228]:
array([[1, 2, 3]])
In [9]:
a2 = a1 = np.array([[1,2,3], [3,4,5]], dtype='int')
a2
Out[9]:
array([[1, 2, 3],
       [3, 4, 5]])
In [12]:
print(a2.ndim)
print(a2.dtype)
print(a2.size)
print(a2.shape)
 
2
int32
6
(2, 3)
In [ ]:
# 用 nunpy 內置的方法來建立數組
In [18]:
#np.zeros(shape, dtype=None, order='C')
#建立shape是3x5的全1(默認浮點型)數組
a3= np.zeros((3,5), order='C')
a3
Out[18]:
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
In [17]:
#np.zeros(shape, dtype=None, order='C')
#建立shape是3x5的全1(默認浮點型)數組
a4 = np.ones((3,5))
a4
Out[17]:
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])
In [19]:
#np.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')
#建立一個形狀爲 N x N 的單位矩陣(二維數組)
a5 = np.eye(3)
a5
Out[19]:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
In [21]:
#empty(shape, dtype=float, order='C')
#建立一個形狀爲shape的未初始化數組,值爲隨機值
a6 =np.empty(5, dtype='int')
Out[21]:
array([0, 0, 0, 0, 0])
In [23]:
a7 = np.empty((3,4))
a7
Out[23]:
array([[1.50665937e-312, 0.00000000e+000, 8.76794447e+252,
        2.15895723e+227],
       [6.48224638e+170, 3.67145870e+228, 7.58253645e-096,
        9.03292329e+271],
       [9.08366793e+223, 1.41075687e+232, 1.16070543e-028,
        1.54730878e+295]])
In [34]:
#np.full(shape, fill_value, dtype=None, order='C')
#建立shape是3x5的(默認浮點型)數組,值fill_value都是3.14
a7 = np.full((3,5),5)
a7
Out[34]:
array([[5, 5, 5, 5, 5],
       [5, 5, 5, 5, 5],
       [5, 5, 5, 5, 5]])
In [35]:
# 使用 arange 來建立
# arange([start,] stop[, step,], dtype=None)
a8 = np.arange(0,20,5)
a8
Out[35]:
array([ 0,  5, 10, 15])
In [230]:
# 使用linspace 來建立
# np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
a9= np.linspace(10,20,6)
a9
Out[230]:
array([10., 12., 14., 16., 18., 20.])
In [233]:
# reshape
a10 = a9.reshape(2,3)
a10
Out[233]:
array([[10., 12., 14.],
       [16., 18., 20.]])
In [51]:
# 形狀 和操做
In [236]:
aa = np.arange(20).reshape(4,5)
aa
Out[236]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
In [237]:
print(aa.shape)
print(aa.size)
 
(4, 5)
20
In [43]:
aa.reshape(5,4) # 不改變數組自己
Out[43]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
In [44]:
aa
Out[44]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
In [45]:
aa.ravel()  # 不改變數組自己
Out[45]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])
In [46]:
aa
Out[46]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
In [238]:
aa
Out[238]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
In [239]:
aa.resize(5,4) # 改變數組自己
In [240]:
aa
Out[240]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
In [241]:
aa.reshape(5,-1) #reshape操做中將維度指定爲-1,則會自動計算其餘維度
Out[241]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
In [52]:
# 將不一樣的數組堆疊在一塊兒
In [243]:
aa = np.floor(10*np.random.random((2,2)))
aa
Out[243]:
array([[1., 8.],
       [4., 4.]])
In [244]:
bb = np.floor(10*np.random.random((2,2)))
bb
Out[244]:
array([[7., 0.],
       [9., 0.]])
In [245]:
xx = np.vstack((aa,bb))
xx
Out[245]:
array([[1., 8.],
       [4., 4.],
       [7., 0.],
       [9., 0.]])
In [246]:
np.hstack((aa, bb))
Out[246]:
array([[1., 8., 7., 0.],
       [4., 4., 9., 0.]])
In [60]:
# numpy 切片和索引
In [61]:
a = np.arange(10)
a
Out[61]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [67]:
s = slice(2,7,2)
print(a[s])
 
[2 4 6]
In [68]:
b = a[2:7:2]
b
Out[68]:
array([2, 4, 6])
In [250]:
aa = np.floor(10*np.random.random((2,12)))
aa
Out[250]:
array([[2., 2., 3., 9., 7., 8., 4., 6., 9., 3., 8., 6.],
       [1., 7., 4., 3., 2., 2., 0., 7., 3., 6., 3., 7.]])
In [258]:
aa
Out[258]:
array([[2., 2., 3., 9., 7., 8., 4., 6., 9., 3., 8., 6.],
       [1., 7., 4., 3., 2., 2., 0., 7., 3., 6., 3., 7.]])
In [259]:
np.hsplit(aa,3) # 平均分紅3份
Out[259]:
[array([[2., 2., 3., 9.],
        [1., 7., 4., 3.]]), array([[7., 8., 4., 6.],
        [2., 2., 0., 7.]]), array([[9., 3., 8., 6.],
        [3., 6., 3., 7.]])]
In [260]:
np.hsplit(aa,(3,4)) # 0-3 3-4 4-   
Out[260]:
[array([[2., 2., 3.],
        [1., 7., 4.]]), array([[9.],
        [3.]]), array([[7., 8., 4., 6., 9., 3., 8., 6.],
        [2., 2., 0., 7., 3., 6., 3., 7.]])]
In [73]:
# 分割 
aa = np.random.randint(1, 50,size=(7,7))
aa
Out[73]:
array([[ 9, 23, 26,  3, 14, 18, 38],
       [14, 32, 24, 27, 47, 34,  7],
       [31, 23, 42, 21, 39, 12, 46],
       [32, 32, 42, 44, 24, 33, 19],
       [49, 37, 25, 27,  5, 30, 11],
       [40, 32, 40, 40, 35, 24,  9],
       [41,  8, 47,  7, 43,  3, 48]])
In [74]:
# np.split(arr,index,axis)
# arr 爲被切分的數組
# index(整數或者數組) 
   # 若是是一個整數 就把當前數組平均分紅index份,若是數組的size不能被index整除則報錯,
   # 若是爲一個數組,則沿的數組的軸線進行切分,好比:[2, 3] 則會被切割成[:2],[2:3],[3:]
# axis 爲切分的方向 默認爲0 橫向  1爲豎向

np.split(aa, [2,4,6], axis=1)
Out[74]:
[array([[ 9, 23],
        [14, 32],
        [31, 23],
        [32, 32],
        [49, 37],
        [40, 32],
        [41,  8]]), array([[26,  3],
        [24, 27],
        [42, 21],
        [42, 44],
        [25, 27],
        [40, 40],
        [47,  7]]), array([[14, 18],
        [47, 34],
        [39, 12],
        [24, 33],
        [ 5, 30],
        [35, 24],
        [43,  3]]), array([[38],
        [ 7],
        [46],
        [19],
        [11],
        [ 9],
        [48]])]
In [75]:
aa
Out[75]:
array([[ 9, 23, 26,  3, 14, 18, 38],
       [14, 32, 24, 27, 47, 34,  7],
       [31, 23, 42, 21, 39, 12, 46],
       [32, 32, 42, 44, 24, 33, 19],
       [49, 37, 25, 27,  5, 30, 11],
       [40, 32, 40, 40, 35, 24,  9],
       [41,  8, 47,  7, 43,  3, 48]])
In [76]:
aa[5]
Out[76]:
array([40, 32, 40, 40, 35, 24,  9])
In [77]:
aa[5,3]
Out[77]:
40
In [78]:
aa[5:]
Out[78]:
array([[40, 32, 40, 40, 35, 24,  9],
       [41,  8, 47,  7, 43,  3, 48]])
In [79]:
aa[:,1:2]
Out[79]:
array([[23],
       [32],
       [23],
       [32],
       [37],
       [32],
       [ 8]])
In [261]:
a = np.array([[1,2,3],[3,4,5],[4,5,6]]) 
print(a)
print("-----------------")
print (a[...,1])   # 第2列元素
print("-----------------")
print (a[1,...])   # 第2行元素
print("-----------------")
print (a[...,1:])  # 第2列及剩下的全部元素

# 三個點( ... )表示產生完整索引元組所需的冒號。例如,若是 x 是rank爲的5數組(即,它具備5個軸),則

# x[1,2,...] 等於 x[1,2,:,:,:]。
# x[...,3] 等效於 x[:,:,:,:,3]。
 
[[1 2 3]
 [3 4 5]
 [4 5 6]]
-----------------
[2 4 5]
-----------------
[3 4 5]
-----------------
[[2 3]
 [4 5]
 [5 6]]
In [263]:
# 整數數組索引
# 實例獲取數組中(0,0),(1,1)和(2,0)位置處的元素。
x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
print(x)
print('--------------')
y = x[[0,1,2],  [0,1,0]]  
print (y)
 
[[1 2]
 [3 4]
 [5 6]]
--------------
[1 4 5]
In [85]:
#獲取了 4X3 數組中的四個角的元素。 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('咱們的數組是:' )
print (x)
print ('\n')
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
print  ('這個數組的四個角元素是:')
print (y)
 
咱們的數組是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


這個數組的四個角元素是:
[[ 0  2]
 [ 9 11]]
In [264]:
# 布爾索引
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('咱們的數組是:')
print (x)
print ('\n')
# 如今咱們會打印出大於 5 的元素  
print  ('大於 5 的元素是:')
print(x>5)
print (x[x >  5])
 
咱們的數組是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


大於 5 的元素是:
[[False False False]
 [False False False]
 [ True  True  True]
 [ True  True  True]]
[ 6  7  8  9 10 11]
In [86]:
a = np.array([np.nan,  1,2,np.nan,3,4,5])  
print (a[~np.isnan(a)])
 
[1. 2. 3. 4. 5.]
In [92]:
np.nan ==  np.nan
Out[92]:
False
In [93]:
# 花式索引
# 花式索引指的是利用整數數組進行索引。

# 花式索引根據索引數組的值做爲目標數組的某個軸的下標來取值。對於使用一維整型數組做爲索引,若是目標是一維數組,
# 那麼索引的結果就是對應位置的元素;若是目標是二維數組,那麼就是對應下標的行。
 
# 花式索引跟切片不同,它老是將數據複製到新數組中。

# 一、傳入順序索引數組
In [265]:
x=np.arange(32).reshape((8,4))
print(x)
print('--------------------')
print (x[[4,2,1,7]])
 
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
--------------------
[[16 17 18 19]
 [ 8  9 10 11]
 [ 4  5  6  7]
 [28 29 30 31]]
In [266]:
x=np.arange(32).reshape((8,4))
print (x[[-4,-2,-1,-7]])
 
[[16 17 18 19]
 [24 25 26 27]
 [28 29 30 31]
 [ 4  5  6  7]]
In [268]:
print (x[([1,5,7,2],[0,3,1,2])])
 
[ 4 23 29 10]
In [270]:
print (x[np.ix_([1,5,7,2],[0,3,1,2])])
 
[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]
In [226]:
x = np.array([[1,2],[3,4],[5,6]])
print(x)
print('-----------')
print(x[[0,1]]) 
print('-------------')
print(x[[0,1],[0,1]])
print('------------------')
# 使用numpy.ix_()函數加強可讀性
print (x[np.ix_([0,1],[0,1])])
print('--------------')
x[[0,1],[0,1]] = [0,0]
print(x) # [[0,2],[3,0],[5,6]]
 
[[1 2]
 [3 4]
 [5 6]]
-----------
[[1 2]
 [3 4]]
-------------
[1 4]
------------------
[[1 2]
 [3 4]]
--------------
[[0 2]
 [3 0]
 [5 6]]
In [271]:
# 迭代數組
In [273]:
# 迭代
a = np.arange(6).reshape(2,3)
print ('原始數組是:')
print (a)
print ('\n')
print ('迭代輸出元素:')
for x in np.nditer(a):
    print (x, end=", " )
print ('\n')
 
原始數組是:
[[0 1 2]
 [3 4 5]]


迭代輸出元素:
[0 1 2], [3 4 5], 

In [275]:
# for x in np.nditer(a, order='F'):Fortran order,便是列序優先;
# for x in np.nditer(a.T, order='C'):C order,便是行序優先;
a = np.arange(6).reshape(2,3)
print(a)
print('------------')
print(a.T)
for x in np.nditer(a, order ='C'):
    print (x, end=", " )
print ('\n')
 
[[0 1 2]
 [3 4 5]]
------------
[[0 3]
 [1 4]
 [2 5]]
0, 1, 2, 3, 4, 5, 

In [117]:
for i in a:
    print(i)
 
[0 1 2]
[3 4 5]
In [123]:
# 修改數組中元素的值
# nditer 對象有另外一個可選參數 op_flags。 默認狀況下,nditer 將視待迭代遍歷的數組爲只讀對象(read-only),爲了在遍歷數組的同時,
# 實現對數組元素值得修改,必須指定 read-write 或者 write-only 的模式。
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print ('原始數組是:')
print (a)
print ('\n')
for x in np.nditer(a, op_flags=['readwrite']): 
    x[...]=2*x 
print ('修改後的數組是:')
print (a)
 
原始數組是:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


修改後的數組是:
[[  0  10  20  30]
 [ 40  50  60  70]
 [ 80  90 100 110]]
In [124]:
# numpy.ndarray.flat 是一個數組元素迭代器,實例以下:
a = np.arange(9).reshape(3,3) 
print ('原始數組:')
for row in a:
    print (row)
 
#對數組中每一個元素都進行處理,可使用flat屬性,該屬性是一個數組元素迭代器:
print ('迭代後的數組:')
for element in a.flat:
    print (element)
 
原始數組:
[0 1 2]
[3 4 5]
[6 7 8]
迭代後的數組:
0
1
2
3
4
5
6
7
8
In [125]:
# 數組操做
# numpy.ndarray.flatten 返回一份數組拷貝,對拷貝所作的修改不會影響原始數組,格式以下:
# ndarray.flatten(order='C')
# order:'C' -- 按行,'F' -- 按列,'A' -- 原順序,'K' -- 元素在內存中的出現順序。
a = np.arange(8).reshape(2,4)
 
print ('原數組:')
print (a)
print ('\n')
# 默認按行
 
print ('展開的數組:')
print (a.flatten())
print ('\n')
 
print ('以 F 風格順序展開的數組:')
print (a.flatten(order = 'F'))
 
原數組:
[[0 1 2 3]
 [4 5 6 7]]


展開的數組:
[0 1 2 3 4 5 6 7]


以 F 風格順序展開的數組:
[0 4 1 5 2 6 3 7]
In [127]:
# 翻轉數組
In [276]:
# numpy.transpose 函數用於對換數組的維度   numpy.ndarray.T 相似 numpy.transpose
 
a = np.arange(12).reshape(3,4)
 
print ('原數組:')
print (a )
print ('\n')
 
print ('對換數組:')
print (np.transpose(a))
print('-------------------')
print(a.T)
 
原數組:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]


對換數組:
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
-------------------
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
In [134]:
# 軸的理解
In [277]:
a = np.array([[78, 34, 87, 25, 83], [25, 67, 97, 22, 13], [78, 43, 87, 45, 89]])
print(a)
print('-------------------')
print(a.max(axis=0))
print(a.max(axis=1))
#axis=0就是豎軸的數據  axis=1就是橫軸的 
 
[[78 34 87 25 83]
 [25 67 97 22 13]
 [78 43 87 45 89]]
-------------------
[78 67 97 45 89]
[87 97 89]
In [278]:
a = np.array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]])
print(a.shape)
print(a)
print('--------------')
print(a.max(axis=0))
print('-----------')
print(a.max(axis=1))
print('-------------')
print(a.max(axis=2))

# 這裏的最大值就是把一個一維數組當成了一個元素
 
(2, 2, 2)
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
--------------
[[4 5]
 [6 7]]
-----------
[[2 3]
 [6 7]]
-------------
[[1 3]
 [5 7]]
In [279]:
# numpy.rollaxis 函數向後滾動特定的軸到一個特定位置
# numpy.rollaxis(arr, axis, start)
# arr:數組
# axis:要向後滾動的軸,其它軸的相對位置不會改變
# start:默認爲零,表示完整的滾動。會滾動到特定位置。
# 建立了三維的 ndarray
a = np.arange(8).reshape(2,2,2)
 
print ('原數組:')
print (a)
print ('\n')
# 將軸 2 滾動到軸 0(寬度到深度)   
# 程序運行np.rollaxis(a, 2)時,講軸2滾動到了軸0前面,其餘軸相對2軸位置不變(start默認0),數組下標排序由0,1,2變成了1,2,0
 
print ('調用 rollaxis 函數:')
print (np.rollaxis(a,2))
# 將軸 0 滾動到軸 1:(寬度到高度)
print ('\n')
 
print ('調用 rollaxis 函數:')
print (np.rollaxis(a,2,1))
 
原數組:
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]


調用 rollaxis 函數:
[[[0 2]
  [4 6]]

 [[1 3]
  [5 7]]]


調用 rollaxis 函數:
[[[0 2]
  [1 3]]

 [[4 6]
  [5 7]]]
In [136]:
# numpy.swapaxes 函數用於交換數組的兩個軸 numpy.swapaxes(arr, axis1, axis2)
# arr:輸入的數組
# axis1:對應第一個軸的整數
# axis2:對應第二個軸的整數
# 建立了三維的 ndarray
a = np.arange(8).reshape(2,2,2)
 
print ('原數組:')
print (a)
print ('\n')
# 如今交換軸 0(深度方向)到軸 2(寬度方向)
 
print ('調用 swapaxes 函數後的數組:')
print (np.swapaxes(a, 2, 0))
 
原數組:
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]


調用 swapaxes 函數後的數組:
[[[0 4]
  [2 6]]

 [[1 5]
  [3 7]]]
In [137]:
# 隨機數組 
In [280]:
# 隨機建立 指定形狀的數組  0-1之間的數
np.random.rand(5)
Out[280]:
array([0.30169196, 0.9670064 , 0.47162448, 0.62679488, 0.73837024])
In [281]:
np.random.rand(5,5, 5)
Out[281]:
array([[[0.89417906, 0.70946608, 0.38672627, 0.76701869, 0.78554922],
        [0.8395321 , 0.6066907 , 0.92352055, 0.9223712 , 0.79842334],
        [0.48239551, 0.01127968, 0.23233443, 0.33877177, 0.84191728],
        [0.31445345, 0.69452591, 0.29333318, 0.46591799, 0.35955757],
        [0.83014411, 0.66361905, 0.2745486 , 0.44315133, 0.11167157]],

       [[0.2932468 , 0.51403315, 0.53770464, 0.81108324, 0.76383529],
        [0.97409406, 0.40976911, 0.21684626, 0.06193826, 0.99271513],
        [0.96543415, 0.6577333 , 0.28238376, 0.82693036, 0.29221568],
        [0.10894843, 0.40101362, 0.87845106, 0.84427336, 0.75716817],
        [0.07480796, 0.19393097, 0.7915619 , 0.4755644 , 0.52351122]],

       [[0.14791434, 0.90730496, 0.14768148, 0.93386785, 0.61918179],
        [0.27887145, 0.82167391, 0.96227453, 0.31035279, 0.96435175],
        [0.61742694, 0.3994602 , 0.9876201 , 0.17050054, 0.80599466],
        [0.93448767, 0.93377353, 0.17567329, 0.35896092, 0.86895971],
        [0.57438796, 0.2828866 , 0.39134851, 0.25140481, 0.37755792]],

       [[0.73122306, 0.41387161, 0.73493688, 0.56681141, 0.38409986],
        [0.62762826, 0.72740016, 0.03333494, 0.2724378 , 0.87094496],
        [0.36300417, 0.06047278, 0.19580073, 0.5297497 , 0.36031132],
        [0.27977137, 0.3582478 , 0.93715713, 0.77016022, 0.5999013 ],
        [0.48798223, 0.24158915, 0.97154431, 0.35866503, 0.54551312]],

       [[0.13168029, 0.61278339, 0.27324304, 0.12304226, 0.90762162],
        [0.98750724, 0.67448499, 0.44045933, 0.1650775 , 0.63162946],
        [0.65731927, 0.39280892, 0.72215663, 0.66654893, 0.53636512],
        [0.33444494, 0.92841366, 0.931691  , 0.06398883, 0.31514842],
        [0.01835854, 0.60237696, 0.03410581, 0.20646853, 0.23836661]]])
In [282]:
# 隨機獲取指定範圍的一個數
np.random.uniform(0,100)
Out[282]:
22.56103050009125
In [283]:
# 隨機獲取指定範圍的一個整數
np.random.randint(0,52)
Out[283]:
35
In [284]:
np.random.randint(0,20,size=(3,4))
Out[284]:
array([[ 7, 15,  8, 15],
       [ 6, 19, 10,  9],
       [ 0, 18, 16, 10]])
In [144]:
np.random.randint(0,20,size=(5,4))
Out[144]:
array([[15,  5, 16, 16],
       [ 0,  4,  2,  0],
       [13, 12, 15,  7],
       [14,  9, 10, 16],
       [11, 15, 10,  1]])
In [145]:
#  np.random.choice(F,N,P)
# 從0-F範圍裏面去N個數(不包含N),P表示機率
np.random.choice(2,2)
Out[145]:
array([1, 1])
In [288]:
a1 = np.random.choice(5,3,p=[0.2,0,0.5,0.3,0])
a1
Out[288]:
array([0, 3, 2], dtype=int32)
In [150]:
b = np.random.randint(0,20,size=(5,4))
print(b)
 
[[16 18  0  1]
 [ 3  2  5 19]
 [ 2 17 10 16]
 [10  5  1  7]
 [11  5 14 12]]
In [151]:
np.random.shuffle(b)
print(b)
 
[[ 2 17 10 16]
 [16 18  0  1]
 [ 3  2  5 19]
 [11  5 14 12]
 [10  5  1  7]]
In [152]:
# 計算
In [153]:
a = [1,2,3,4]
b= np.array(a,dtype='float')
b
Out[153]:
array([1., 2., 3., 4.])
In [154]:
b+1
Out[154]:
array([2., 3., 4., 5.])
In [155]:
b
Out[155]:
array([1., 2., 3., 4.])
In [156]:
a = np.array([1,3,5,7])
a
Out[156]:
array([1, 3, 5, 7])
In [157]:
# 同緯度且個數相同的數組相加
a+b
Out[157]:
array([ 2.,  5.,  8., 11.])
In [289]:
# 數組a中大於3的數就會顯示True小於3的數就會顯示False
a[a>3]
Out[289]:
array([4, 5, 6, 7])
In [159]:
print(a)
a[a>3]
 
[1 3 5 7]
Out[159]:
array([5, 7])
In [161]:
c = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
c
Out[161]:
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
In [290]:
# 求出c中大於5且爲偶數的元素
c[(c>5) & (c%2==0)]
Out[290]:
array([ 6,  8, 10])
In [292]:
d=np.array([1.1,2.2,3.3,4.4,5.5,6.6,7.7])  
d
Out[292]:
array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7])
In [294]:
# 向上取整
print(np.ceil(d))
# 向下取整
print(np.floor(d))
# 絕對值
print(np.abs(d))
# 開方
print(np.sqrt(b))
# 分別去除小數部分和整數部分
print('------------------')
print(np.modf(d))
# e爲底的指數函數
print(np.exp(d))
print(np.log(d))
# 四捨五入
print(np.round(d))
print('------------------')
print(np.rint(d))
# 向0取整
print(np.trunc(d))
# 是否不等於任何整數
print(np.isnan(d))
# 
print(np.cos(b))
print(np.sin(b))
print(np.tan(b))

# 上述操做 對普通列表 也實用
 
[2. 3. 4. 5. 6. 7. 8.]
[1. 2. 3. 4. 5. 6. 7.]
[1.1 2.2 3.3 4.4 5.5 6.6 7.7]
[7.41619849 1.         1.41421356 1.73205081 2.         2.23606798
 2.44948974 2.64575131 2.82842712 3.         3.16227766 3.31662479]
------------------
(array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]), array([1., 2., 3., 4., 5., 6., 7.]))
[   3.00416602    9.0250135    27.11263892   81.45086866  244.69193226
  735.09518924 2208.34799189]
[0.09531018 0.78845736 1.19392247 1.48160454 1.70474809 1.88706965
 2.04122033]
[1. 2. 3. 4. 6. 7. 8.]
------------------
[1. 2. 3. 4. 6. 7. 8.]
[1. 2. 3. 4. 5. 6. 7.]
[False False False False False False False]
[ 0.02212676  0.54030231 -0.41614684 -0.9899925  -0.65364362  0.28366219
  0.96017029  0.75390225 -0.14550003 -0.91113026 -0.83907153  0.0044257 ]
[-0.99975517  0.84147098  0.90929743  0.14112001 -0.7568025  -0.95892427
 -0.2794155   0.6569866   0.98935825  0.41211849 -0.54402111 -0.99999021]
[-4.51830879e+01  1.55740772e+00 -2.18503986e+00 -1.42546543e-01
  1.15782128e+00 -3.38051501e+00 -2.91006191e-01  8.71447983e-01
 -6.79971146e+00 -4.52315659e-01  6.48360827e-01 -2.25950846e+02]
In [295]:
print(d)
print('-------------------------')
# 求和
print(d.sum())
# 平均值
print(d.mean())
# 等差數列
print(d.cumsum())
# 標準差
print(d.std())
# 方差
print(d.var())
# 最小值
print(d.min())
#最大值
print(d.max())
print('---------------')
# 最大值索引
print(d.argmin())
# 最小值索引
print(d.argmax())
 
[1.1 2.2 3.3 4.4 5.5 6.6 7.7]
-------------------------
30.8
4.4
[ 1.1  3.3  6.6 11.  16.5 23.1 30.8]
2.2
4.840000000000001
1.1
7.7
---------------
0
6
In [297]:
a = np.array( [20,30,40,50] )
b = np.arange( 4 )
print(a)
print('-----')
print(b)
 
[20 30 40 50]
-----
[0 1 2 3]
In [298]:
c = a-b
c
Out[298]:
array([20, 29, 38, 47])
In [174]:
b**2
Out[174]:
array([0, 1, 4, 9], dtype=int32)
In [175]:
10*np.sin(a)
Out[175]:
array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])
In [307]:
# 與許多矩陣語言不一樣,乘法運算符 * 的運算在NumPy數組中是元素級別的。矩陣乘積可使用 dot 函數或方法執行
a = np.array( [[1,1,1],[0,1,1]] )
a    
Out[307]:
array([[1, 1, 1],
       [0, 1, 1]])
In [317]:
b = np.array( [[2,0], [3,4], [1,1] ])
b
Out[317]:
array([[2, 0],
       [3, 4],
       [1, 1]])
In [315]:
a*b
Out[315]:
array([[2, 0, 1],
       [0, 4, 1]])
In [318]:
a.dot(b)
Out[318]:
array([[6, 5],
       [4, 5]])
In [319]:
a = np.ones((2,3), dtype=int)
a
Out[319]:
array([[1, 1, 1],
       [1, 1, 1]])
In [320]:
a*=3
a
Out[320]:
array([[3, 3, 3],
       [3, 3, 3]])
In [322]:
b = np.random.randint(0,6, size=(2,3))
b
Out[322]:
array([[1, 3, 2],
       [1, 0, 2]])
In [323]:
b+=a
b
Out[323]:
array([[4, 6, 5],
       [4, 3, 5]])
In [325]:
print(a)
print(b)
a+=b
a
 
[[7 9 8]
 [7 6 8]]
[[4 6 5]
 [4 3 5]]
Out[325]:
array([[11, 15, 13],
       [11,  9, 13]])
In [ ]:
# 複製和視圖
In [ ]:
# NumPy中,數組的複製有三種方式:
# Python通用的地址複製:經過 b = a 複製 a 的值,b 與 a 指向同一地址,改變 b 同時也改變 a。
# 經過視圖ndarray.view()僅複製值,當對 c 值進行改變會改變 a 的對應的值,而改變 c 的 shape 不改變 a 的 shape。

# ndarray.copy() 進行的完整的拷貝,產生一份徹底相同的獨立的複製。
In [210]:
a = np.arange(12)
a
Out[210]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
In [211]:
b=a
a is b
Out[211]:
True
In [212]:
 c = a.view()
 c   
Out[212]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
In [326]:
a is c
Out[326]:
False
In [216]:
c.shape = 2,6
c
Out[216]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [217]:
c [0,0] = 55
a
Out[217]:
array([55,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
In [218]:
d = a.copy()
d is a 
Out[218]:
False
In [219]:
d 
Out[219]:
array([55,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
In [221]:
d.shape = 2,6
d
Out[221]:
array([[55,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [222]:
d[1,1] = 22
a
Out[222]:
array([55,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
In [ ]:
 
In [ ]:
相關文章
相關標籤/搜索