Numpy使用入門

Bobbyby發表於2018-06-26

Jupyter

啟動

jupyter notebook

magic methed

執行外部python檔案 %run /home/nanfengpo/Desktop/bb.py
執行計時 %time statement 計算程式碼塊的執行時間
%timeit statement 計算程式碼執行的平均時間
%%timeit statement1 statement2 計算多行程式碼的平均執行速度
檢視當前會話中的所有變數和函式 %who 檢視當前會話的所有變數和函式名稱
%whos 檢視當前會話的所有變數和函式名稱的詳細資訊
%who_is 返回一個字串列表,裡面元素是當前會話的所有變數與函式名稱
執行linux指令 在指令前 加 ! 例如 !ls
更多魔法指令 lsmagic 列出所有魔法指令

jupyter notebook 快捷鍵

enter 進入編輯模式
shift+enter 執行本單元,選中下一單元
Y 單元轉入程式碼狀態
M 單元轉入Markdown狀態
A 在上方插入新單元
B 在下方插入新單元
Double-D 刪除一行
ctrl+enter 執行本單元
alt+enter 執行本單元,在下面插入一個單元

Numpy

Numpy是python的一種開源的數值計算擴充套件

  • 強大的N維陣列物件Array
  • 豐富的函式庫
  • 使用者整合C/C++和Fortran程式碼的工具包
  • 使用的線性代數,傅立葉變換和隨機數生成函式
  • numpy和係數矩陣運算包scipy配合使用更加強大

使用方法

建立陣列物件

  • 使用np.array() 建立
建立一維array物件
import numpy as np
test = np.array([1,2,3,4,5])
test
輸出 array([1, 2, 3, 4, 5])

建立多維array物件
test = np.array([[1,2,3],[4,5,6]])
test
輸出 array([[1, 2, 3],
       [4, 5, 6]])

使用np的常規函式建立

陣列物件內部引數固定為1

np.ones(shape, dtype=None, order='C')

引數shape是array陣列的樣式 dtype是陣列裡引數的型別 order='C'

np.ones([3,3])
輸出結果:
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

np.ones([3,3],dtype=int)
輸出結果:
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
自定義陣列物件內部引數

np.full(shape, fill_value, dtype=None, order='C')

fill_value 是陣列物件填充的引數

np.full([3,3],3.14)
輸出結果:
array([[ 3.14,  3.14,  3.14],
       [ 3.14,  3.14,  3.14],
       [ 3.14,  3.14,  3.14]])
對角線生成多維陣列物件

np.eye(N, M=None, k=0, dtype=float) k引數為便宜

np.eye(4,4)
輸出結果:
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])
np.eye(4,4,1)
輸出結果:
array([[ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.]])
np.eye(4,4,-1)
輸出結果:
array([[ 0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.]])

生成等差數列

(1)指定起始值,結束值,以及需要生成的個數 生成等差數列一維陣列

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

start 起始值 stop 結束值 引數num 分成的份數

retstep 為True時 顯示步長 endpoint為True時 最後一個值是stop值

等差數列
np.linspace(0,10,5)
輸出結果:
array([  0. ,   2.5,   5. ,   7.5,  10. ])
(2)指定起始值,結束值,以及步長 生成等差數列 一維陣列

np.arange([start, ]stop, [step, ]dtype=None)

等差數列
np.arange(0,10,2)
輸出結果:
array([0, 2, 4, 6, 8])

生成隨機數

(1)隨機整數一維陣列

np.random.randint(low, high=None, size=None, dtype='l')

size是生成的數量

np.random.randint(0,10,5)
輸出結果:
array([0, 7, 2, 3, 7])
(2)隨機數一維/多維陣列

np.random.randn(d0, d1, ..., dn)

#例子
np.random.randn(4,3,2)
輸出   從最後一個引數開始  2個數一組   3個組一列   最後 生成4個列 
array([[[-0.75635231,  0.81645401],
        [ 0.75044476, -0.45594693],
        [ 1.18962227, -1.69061683]],

       [[-1.35639905, -1.23243451],
        [-0.54443916, -0.66817174],
        [ 0.00731456, -0.61293874]],

       [[ 1.29974807, -1.73309562],
        [-0.9833101 ,  0.35750775],
        [-1.6135785 ,  1.47071387]],

       [[-1.1880176 , -0.54974619],
        [-0.94004616, -0.82793236],
        [ 0.10886347,  0.50780959]]])
np.random.randn(10)
# 每次每次都不一樣
輸出結果:
array([-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604,  0.98132079,
        0.51421884,  0.22117967, -1.07004333, -0.18949583,  0.25500144])

np.random.seed(100)#隨機的種子,有了種子,每次都一樣
np.random.randn(10)

輸出結果:
array([ 0.37332715, -0.2887605 ,  0.04985088, -0.93815832, -0.4087037 ,
        1.13352254,  0.52713526, -0.76014192, -0.97292788,  0.16290446])
(3)隨機數一維陣列

np.random.random(size=None)

np.random.random(3)
array([0.73130075, 0.34038522, 0.0920556 ])

陣列的屬性

  • ndim 維度
  • shape 各個維度的長度
  • size 總長度
  • dtype 元素型別

陣列的操作

索引
np.random.seed(2)
# 隨機整數 5個一列 4列一組  生成3組
x = np.random.randint(10,size=[3,4,5])
# 取第3組第1列第1個
print(x[2,0,0])
print(x)
輸出
6
[[[8 8 6 2 8]
  [7 2 1 5 4]
  [4 5 7 3 6]
  [4 3 7 6 1]]

 [[3 5 8 4 6]
  [3 9 2 0 4]
  [2 4 1 7 8]
  [2 9 8 7 1]]

 [[6 8 5 9 9]
  [9 3 0 0 2]
  [8 8 2 9 6]
  [5 6 6 6 3]]]
切片
一維與列表完全一致 多維時同理
np.random.seed(0)
x = np.random.randint(100,size = (10,4))
x
輸出結果:
array([[44, 47, 64, 67],
       [67,  9, 83, 21],
       [36, 87, 70, 88],
       [88, 12, 58, 65],
       [39, 87, 46, 88],
       [81, 37, 25, 77],
       [72,  9, 20, 80],
       [69, 79, 47, 64],
       [82, 99, 88, 49],
       [29, 19, 19, 14]])

切片:
x[7:10]
切片結果:
array([[69, 79, 47, 64],
       [82, 99, 88, 49],
       [29, 19, 19, 14]])
變形
使用reshape函式,注意引數是一個tuple!
x = np.arange(0,16).reshape(4,4)
x

執行結果:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

型別是:
type(x.shape)

tuple
級聯

np.concatenate([x,x],axis = 0)

np.concatenate() 級聯需要注意的點:
級聯的引數是列表:一定要加中括號
維度必須相同
形狀相符
【重點】級聯的方向預設是shape這個tuple的第一個值所代表的維度方向
可通過axis引數改變級聯的方向np.concatenate() 級聯需要注意的點:
級聯的引數是列表:一定要加中括號
維度必須相同
形狀相符
【重點】級聯的方向預設是shape這個tuple的第一個值所代表的維度方向
可通過axis引數改變級聯的方向

x = np.array([1,2,3])
y = np.array([1,5,6,7,3,20])
x
輸出 array([1, 2, 3])
輸出 array([ 1,  5,  6,  7,  3, 20])

z = np.concatenate([x,y])
z
輸出 array([ 1,  2,  3,  1,  5,  6,  7,  3, 20])
z.shape
輸出 (9,)

/////////////////////////////////////////////////////
#二維
x = np.array([[1,2,3],[4,5,6]])
x

array([[1, 2, 3],
       [4, 5, 6]])

x.shape
(2,3)

p = np.concatenate([x,x]).shape
p
(4, 3)

如果增加 axis 引數

個人理解:

加入有兩個 shape為 (4,3,2) 的陣列級聯操作

axis 為0 時 是 最外層的相加 也就4 這個級別

axis為1 時 是第二層的相加 也就是3這一層

axis為2時 是第三層的相加 就是2這一層

下面這個是例子 是 兩個 shape為 (2,3,3)的陣列的級聯操作

import numpy as np
x = np.array([[[1,2,3],[2,2,3],[3,3,3]],[[4,4,4],[5,5,5],[6,6,6]]])
print(x)
print(x.shape)
輸出:
[[[1 2 3]
  [2 2 3]
  [3 3 3]]

 [[4 4 4]
  [5 5 5]
  [6 6 6]]]
(2, 3, 3)
////////////////////////////////
w = np.concatenate([x,x],axis = 0)
print(w.shape)
print(w)
輸出:
(4, 3, 3)
[[[1 2 3]
  [2 2 3]
  [3 3 3]]

 [[4 4 4]
  [5 5 5]
  [6 6 6]]

 [[1 2 3]
  [2 2 3]
  [3 3 3]]
 
 [[4 4 4]
  [5 5 5]
  [6 6 6]]]
////////////////////////////////////
w = np.concatenate([x,x],axis = 1)
print(w.shape)
print(w)
輸出:
(2, 6, 3)
[[[1 2 3]
  [2 2 3]
  [3 3 3]
  [1 2 3]
  [2 2 3]
  [3 3 3]]

 [[4 4 4]
  [5 5 5]
  [6 6 6]
  [4 4 4]
  [5 5 5]
  [6 6 6]]]
/////////////////////////////////////
w = np.concatenate([x,x],axis = 2)
print(w.shape)
print(w)

輸出:
(2, 3, 6)
[[[1 2 3 1 2 3]
  [2 2 3 2 2 3]
  [3 3 3 3 3 3]]

 [[4 4 4 4 4 4]
  [5 5 5 5 5 5]
  [6 6 6 6 6 6]]]

水平級聯和垂直級聯

np.hstack 水平級聯

np.vstack 垂直級聯

x = np.array([[1,1],[2,2],[3,3]])
y = np.array([1,2,3])
print(np.hstack(x))
print(np.vstack(y))

輸出:
[1 1 2 2 3 3]
[[1]
 [2]
 [3]]
切分

(1)np.split()

np.split(ary, indices_or_sections, axis=0)

x = np.arange(1,10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
x1,x2,x3 = np.split(x,[3,5])  #[3,5] 是索引位置
print(x1,x2,x3)
輸出:
[1 2 3] [4 5] [6 7 8 9]
___________________________
x1,x2,x3,x4 = np.split(x,[1,4,6])
print(x1,x2,x3,x4)
輸出:
[1] [2 3 4] [5 6] [7 8 9]
____________________________
x = np.arange(3,10)
x
輸出: array([3, 4, 5, 6, 7, 8, 9])
x1,x2,x3,x4 = np.split(x,[1,3,5])
print(x1,x2,x3,x4)
輸出:[3] [4 5] [6 7] [8 9]

(2)np.hsplit()

垂直切分

x = np.arange(16).reshape(4,4)
x
輸出:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

print(np.hsplit(x,[2,3])) 
# [2,3] 是切的位置  2 為 0,1 |4,5| 8,9 | 12,13
# 3為 2 6 10 14
輸出:
[array([[ 0,  1],[ 4,  5], [ 8,  9], [12, 13]]),
         array([[ 2],  [ 6],  [10], [14]]), 
         array([[ 3],  [ 7],  [11],  [15]])]

(3)np.vsplit()

橫切

x = np.arange(16).reshape(4,4)
x
輸出:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
# 橫切  把 1,2 兩行 切到一組   第3行切為一組  剩餘的為一組
print(np.vsplit(x,[2,3]))
輸出:
[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]), array([[ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])]
副本

所有賦值運算不會為ndarray的任何元素建立副本。對賦值後的物件的操作也對原來的物件生效

a = np.array([1,2,3])
b=a
print(a,b)
輸出:
[1 2 3] [1 2 3]

b[0]=2
a
輸出:
array([2, 2, 3])

可使用copy()函式建立副本

a = np.array([1,2,3])
b = a.copy()
b
輸出:
[1,2,3]

b[0]=3
print(a,b)
輸出:
[1 2 3] [3 2 3]

聚合操作

  • 求和np.sum()
x = np.arange(4)
np.sum(x)
輸出 6
  • 最大最小值:np.max/ np.min
  • 求平均值 np.mean(heights)
  • 計算標準差 heights.std()

矩陣操作

  • 基本操作 加減乘除
a = np.array([[1,2,3],
[4,5,6]])
a
輸出:
array([[1, 2, 3],
       [4, 5, 6]])
a+1
輸出:
array([[2, 3, 4],
       [5, 6, 7]])
a*2
輸出:
array([[ 2,  4,  6],
       [ 8, 10, 12]])

a+[[1,4,9],[3,3,3]]
輸出:
array([[ 2,  6, 12],
       [ 7,  8,  9]])

a*2-2
輸出:
array([[ 0,  2,  4],
       [ 6,  8, 10]])
  • 矩陣積

    A*B

    A的橫排去乘B的豎排 按順序去乘即可

  • 廣播機制

【重要】ndarray廣播機制的兩條規則
規則一:為缺失的維度補1
規則二:假定缺失元素用已有值填充

例子

a = np.ones((4,1))
a 
輸出: 
    array([[1.],
       [1.],
       [1.],
       [1.]])
b = np.arange(4)
b
輸出:
    array([0, 1, 2, 3])

a + b    
a 實際上變成了 
    array([[1.,1,1,1],
       [1.,1,1,1],
       [1.,1,1,1],
       [1.,1,1,1]])
這個就是規則1 給缺失的維度補1
而b變成了
        array([[0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3]])
這個就是規則2 假定缺失元素用已有值填充

因此 a+b的值 輸出為

array([[1., 2., 3., 4.],
       [1., 2., 3., 4.],
       [1., 2., 3., 4.],
       [1., 2., 3., 4.]])
排序
  • 快速排序

np.sort()與ndarray.sort()都可以,但有區別:
np.sort()不改變輸入
ndarray.sort()本地處理,不佔用空間,但改變輸入

  • 部分排序

np.partition(a,k) #引數1是陣列 引數2是要的個數

當k為正數時 要最小的k個 數 這幾個數在陣列前k個

當k為負數時 要最大的k個 數 這幾個數在陣列後k個

有的時候我們不是對全部資料感興趣,我們可能只對最小或最大的一部分感興趣。
當k為正時,我們想要得到最小的k個數
當k為負時,我們想要得到最大的k個數

相關文章