Numpy入門指南

2021-03-02 張知灼見

Numpy 入門指南
array基本屬性

Numpy的主要對象是同構多維數組。它是一個元素表,所有類型都相同,由非負整數元組構成索引。

Numpy的數組類被調用為ndarray。存在以下屬性:

•ndarray.ndim:數組的軸(維度)的個數。•ndarray.shape:數組的維度。一個整數元組,表示每個維度中數組的大小。對於有n行和m列的矩陣,shape將是(n,m),即shape元組長度就是rank或者維度的個數ndim。• ndarray.size:數組元素的總數。•ndarray.dtype:一個描述數組中元素類型的對象 。• ndarray.itemsize:數組中每個元素的字節大小。例如,元素為 float64 類型的數組的 itemsize 為8(=64/8),而 complex32 類型的數組的 itemsize 為4(=32/8)。它等於 ndarray.dtype.itemsize 。

import numpy as np 

#如何將列錶轉化為矩陣
array=np.array([[1,2,3],
[2,3,4]])
print(array)
#查看維度ndim
print('number of dim: ',array.ndim)
##output: number of dim: 2
#查看幾行幾列
print('shape: ',array.shape)
##output: shape: (2, 3)
#查看元素個數
print('size: ',array.size)
##output: size: 6

創建數組np.array

使用array函數從python元組中創建數組, 默認情況下,創建的數組的dtype是 float64 類型的。

import numpy as np
#創建一維數組,ndim=1
a=np.array([2,23,4],dtype=np.int32)
print(a)
##output:[ 2 23 4]

#創建二維數組
b = np.array([(1.5,2,3), (4,5,6)])
print(b)
##output: [[ 1.5 2. 3. ]
## [ 4. 5. 6. ]]

注意:常見錯誤是,調用array時候傳入多個數字參數,而不提供單個數字的列表類型作為參數。

>>> a = np.array(1,2,3,4)    # WRONG
>>> a = np.array([1,2,3,4]) # RIGHT

np.zeros

創建一個全為0的數組 .

>>> np.zeros( (3,4) )
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])

np.ones

創建一個全為1的數組 .

>>> np.ones((2,3,4), dtype=np.int16) # dtype can also be specified
array([[[ 1, 1, 1, 1],
[ 1, 1, 1, 1],
[ 1, 1, 1, 1]],
[[ 1, 1, 1, 1],
[ 1, 1, 1, 1],
[ 1, 1, 1, 1]]], dtype=int16)

np.empty

創建一個數組,其初始內容是隨機的,取決於內存的狀態。

>>> np.empty( (2,3) )    # uninitialized, output may vary
array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],
[ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])

np.arange

該函數返回指定範圍內數組而不是列表 。(注意是左包含即[start,stop) )

numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)

主要參數:start--開始;step--結束;step:步長

>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange( 0, 2, 0.3 ) # it accepts float arguments
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])

np.linspace

當arange與浮點參數一起使用時,由於有限的浮點精度,通常不可能預測所獲得的元素的數量。出於這個原因,通常最好使用linspace函數來接收我們想要的元素數量的函數,而不是步長(step)

def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None,axis=0):

>>> from numpy import pi
>>> np.linspace( 0, 2, 9 )# 9 numbers from 0 to 2
array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
>>> x = np.linspace( 0, 2*pi, 100 )# useful to evaluate function at lots of points
>>> f = np.sin(x)

數組基本運算加減運算
import numpy as np 
#加減運算
a=np.array([10,20,30,40])
b=np.arange(4)
print(a,b)
##[10 20 30 40] [0 1 2 3]
c=a+b
d=a-b
print(c,d)
##[10 21 32 43] [10 19 28 37]

點乘、叉乘
import numpy as np 

a=np.array([10,20,30,40])
b=np.arange(4)
#叉乘
c=a*b
print("\n叉乘運算:",c)
##output:叉乘運算: [ 0 20 60 120]

#點乘
aa=np.array([[1,1],[0,1]])
bb=np.arange(4).reshape((2,2))
c_dot=np.dot(aa,bb)
c_dot_2=aa.dot(bb)

print("\n點乘運算之一:",c_dot)
##點乘運算之一: [[2 4]
## [2 3]]
print("\n點乘運算之二:",c_dot_2)
##點乘運算之二: [[2 4]
## [2 3]]

乘方

使用a**b表示a的b次方

import numpy as np 
b=np.arange(4)
#乘方運算
f=b**2
print("\n乘方運算:",f)
#output:[0 1 4 9]

邏輯運算

快速查找數組中符合條件的值,涉及到>、<、==、>=、 <= 、!=,返回一個全為布爾值的數組

import numpy as np 
b=np.arange(4)
# output:[0 1 2 3]
#快速查找符合要求的值,邏輯判斷
print(b==3,'\n')
#output :[False False False True]
print(b!=3,'\n')
#output:[ True True True False]

轉秩
import numpy as np
B=np.arange(14,2, -1).reshape((3,4))
# B :array([[14, 13, 12, 11],
# [10, 9, 8, 7],
# [ 6, 5, 4, 3]])
print(np.transpose(B))
#[[14 10 6]
# [13 9 5]
# [12 8 4]
# [11 7 3]]
print(B.T)
#[[14 10 6]
# [13 9 5]
# [12 8 4]
# [11 7 3]]

np.sort

對矩陣中的所有值從大到小排序。

#排序函數,sort(),針對每一行進行從小到大排序操作
B=np.arange(14,2, -1).reshape((3,4))
# B :array([[14, 13, 12, 11],
# [10, 9, 8, 7],
# [ 6, 5, 4, 3]])
print(np.sort(B))

# B':array([[11,12,13,14],
# [ 7, 8, 9,10],
# [ 3, 4, 5, 6]])

np.clip
import numpy as np 

A=np.arange(2,14).reshape((3,4))

#clip函數,clip(Array,Array_min,Array_max),Array指的是將要被#執行用的矩陣,而後面的最小值最大值則用於讓函數判斷矩陣中元素是否有比#最小值小的或者比最大值大的元素,並將這些指定的元素轉換為最小值或者最#大值。
print(np.clip(A,5,9))

np.argmin

查找矩陣中的最小值的索引值

np.argmax

查找矩陣中的最大值的索引值

import numpy as np 

A=np.arange(2,14).reshape((3,4))
#[[ 2 3 4 5]
# [ 6 7 8 9]
# [10 11 12 13]]
#numpy基本運算
print(A)
#求矩陣中最小元素
print('最小值的索引值',np.argmin(A))
##最小值的索引值 0
#求矩陣中最大元素
print('最大值的索引值',np.argmax(A))
#最大值的索引值 11

np.mean

求矩陣所有值的均值,亦寫成A.mean()

同np.average( )

np.average
import numpy as np 

A=np.arange(2,14).reshape((3,4))

#求矩陣的均值
print('矩陣平均值表示之一',np.mean(A),'|',A.mean())
#矩陣平均值表示之一 7.5 | 7.5

print('矩陣平均值表示之二',np.average(A))
#矩陣平均值表示之二 7.5

np.cumsum
import numpy as np 

A=np.arange(2,14).reshape((3,4))
#求矩陣n項累加
#eg: array([ [ 2, 3, 4, 5]
# [ 6, 7, 8, 9]
# [10,11,12,13] ])
# ---&gt;[2 5 9 14 20 27 35 44 54 65 77 90]
print('矩陣前n項累加',np.cumsum(A))

np.diff
import numpy as np 

A=np.arange(2,14).reshape((3,4))
#累差運算函數diff,計算的便是每一行中後一項與前一項之差.
#eg: array([ [ 2, 3, 4, 5], array([[1,1,1],
# [ 6, 7, 8, 9], ---&gt; [1,1,1],
# [10,11,12,13] ]) [1,1,1]])
print(np.diff(A))

np.exp

求e的冪次方。

>>> b=np.array([2,4,6])
>>> np.exp(b)
array([ 7.3890561 , 54.59815003, 403.42879349])

np.sqrt

開方函數

>>> c=np.array([4,9,16])
>>> np.sqrt(c)
array([2., 3., 4.])

索引、切片和迭代一維數組

一維的數組可以進行索引、切片和迭代操作。

>>> import numpy as np
>>> a=np.arange(10)**3
>>> a
array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729], dtype=int32)
>>> a[2] #獲取第二個值
8
>>> a[2:5] #獲取第二到第五個值,以數組形式返回
array([ 8, 27, 64], dtype=int32)
>>> a[:6:2]=-1000 #修改第零個、第二個、第六個值為-1000
>>> a
array([ -1000, 1, -1000, 27, -1000, 125, 216, 343, 512,
729], dtype=int32)
>>> a[ : :-1] #倒序a
array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000], dtype=int32)
>>> for i in a:
... print(i**(1/3.))
...
nan
1.0
nan
3.0
nan
5.0
5.999999999999999
6.999999999999999
7.999999999999999
8.999999999999998

多維數組

多維數組的每一個軸都有一個索引,這些索引以逗號的形式分隔的元組給出:

>>> def f(x,y):
... return 5*x+y
...
>>> b=np.fromfunction(f,(5,4),dtype=int)
>>> b
array([[ 0, 1, 2, 3],
[ 5, 6, 7, 8],
[10, 11, 12, 13],
[15, 16, 17, 18],
[20, 21, 22, 23]])
>>> b[2,3] #第二行第三列的數字
13
>>> b[0:5,1] #第0~5行第1列的數字,以數組形式返回
array([ 1, 6, 11, 16, 21])
>>> b[ : ,1] #第1列的數字,以數組形式返回
array([ 1, 6, 11, 16, 21])
>>> b[1:3,:] #第1~3行的數字,以數組形式返回
array([[ 5, 6, 7, 8],
[10, 11, 12, 13]])

對多維數組進行迭代(iterating)是相對於第一個軸完成的。

>>> for row in b:
... print(row)
...
[0 1 2 3]
[5 6 7 8]
[10 11 12 13]
[15 16 17 18]
[20 21 22 23]

迭代操作

如果想要對數組中的每個元素執行操作,可以使用flat屬性,該屬性是數組的所有元素的迭代器[1] :

>>> for element in b.flat:
... print(element)
...
0
1
2
3
5
6
7
8
10
11
12
13
15
16
17
18
20
21
22
23

array形狀操作改變數組的形狀array.ravel()

化成1*n的矩陣。

>>> a=np.floor(10*np.random.random((3,4)))
>>> a
array([[9., 8., 7., 4.],
[5., 3., 5., 9.],
[9., 4., 0., 0.]])
>>> a.shape
(3, 4)
>>> a.ravel()
array([9., 8., 7., 4., 5., 3., 5., 9., 9., 4., 0., 0.])
>>> a.reshape(-1)
array([9., 8., 7., 4., 5., 3., 5., 9., 9., 4., 0., 0.])

Ps: array.ravel()作用等同於array.reshape(-1)

array.T

轉置矩陣 。

>>> a.T
array([[9., 5., 9.],
[8., 3., 4.],
[7., 5., 0.],
[4., 9., 0.]])
>>> a.T.shape
(4, 3)

array.reshape()

改變為任意形狀 。

>>> a = np.arange(6).reshape((3, 2))#將1*6矩陣轉為3*2矩陣
>>> a
array([[0, 1],
[2, 3],
[4, 5]])
>>> np.reshape(a, (2, 3)) #將3*2矩陣轉為2*3矩陣
array([[0, 1, 2],
[3, 4, 5]])
>>> a.reshape(2,-1) #reshape操作中將size指定為-1,則會自動計算其他的size大小:
array([[0, 1, 2],
[3, 4, 5]])

array.resize( )

該方法會直接修改數組本身的shape和size。

>>> a=np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a.resize((2,6))
>>> a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])

堆疊數組np.vstack

屬於一種上下合併的情況。

import numpy as np
#合併Array
A=np.array([1,1,1])
B=np.array([2,2,2])
#vstack:屬於一種上下合併
print(np.vstack((A,B))) #Vertical stack
#output: [[1 1 1]
# [2 2 2]]

np.hstack

屬於一種左右合併的情況

import numpy as np

A=np.array([1,1,1])
B=np.array([2,2,2])

D=np.hstack((A,B))
print(D)
#[1 1 1 2 2 2]
E=np.hstack((B,A))
print(E)
#[2 2 2 1 1 1]

np.concatenate
#針對多個矩陣或序列進行合併操作,藉助
# np.concatenate((A,A,A,...),axis=0 或 1)
>>> a = np.array([[1, 2], [3, 4]])
>>>a
>>>array([[1, 2],
[3, 4]])
>>> b = np.array([[5, 6]])
>>> b
array([[5, 6]])
>>> np.concatenate((a, b), axis=0)#合併列
array([[1, 2],
[3, 4],
[5, 6]])
>>> np.concatenate((a, b.T), axis=1) #合併行
array([[1, 2, 5],
[3, 4, 6]])
>>> np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

分割數組numpy.split
import numpy as np
A=np.arange(12).reshape((3,4))
print(A)

#分割函數np.split(array,number of split row/column,axis= 0 or 1)
print(np.split(A,2,axis=1))#把四列分成2塊(2列一塊)
# [array([ [0, 1],
# [4, 5],
# [8, 9]]), array([[ 2, 3],
# [ 6, 7],
# [10, 11]])]
#axis=0,表示按行分割;axis=1,表示按列分割
print(np.split(A,3,axis=0)) #把三行按行分成3塊(一行一塊)
#[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]

np.hsplit

按列拆開數組。

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

np.vsplit

按行拆開數組。

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

>>> np.vsplit(x, 2)
[array([[0., 1., 2., 3.],
[4., 5., 6., 7.]]),
array([[ 8., 9., 10., 11.],
[12., 13., 14., 15.]])]

np.array_split

將一個數組拆分為大小相等或近似相等的多個子數組。如果無法進行均等劃分,則不會引發異常。

>>> x = np.arange(8.0)
>>> np.array_split(x, 3)
[array([0., 1., 2.]), array([3., 4., 5.]), array([6., 7.])]

拷貝和深拷貝

當計算和操作數組時,有時會將數據複製到新數組中,有時則不會 。

存在以下3種情況:

完全不複製

簡單分配不會複製數組對象或其數據。

import numpy as np

a=np.arange(4)
# =的賦值方式會帶有關聯性
b=a
c=a
d=b
#改變a的第一個值,b、c、d的第一個值也會同時改變。

淺拷貝

不同的數組對象可以共享相同的數據。view方法創建一個查看相同數據的新數組對象。

>>> import numpy as np
>>> a=np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> c=a.view()
>>> c is a
False
>>> c.base is a
False
>>> c
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> c.shape = 2,6
>>> c
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
>>> a.shape
(3, 4)
>>> c[0,4] = 1234
>>> a
array([[ 0, 1, 2, 3],
[1234, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> c
array([[ 0, 1, 2, 3, 1234, 5],
[ 6, 7, 8, 9, 10, 11]])

深拷貝copy()

該copy方法生成數組及其數據的完整副本。 

import numpy as np

a=np.arange(4)
#copy()的賦值方式沒有關聯性
b=a.copy()
print(b)
a[3]=45
print('a:',a)
#a: [11 1 2 45]
print('b:',b)
#b: [11 1 2 3]

@all right save,ZhangGehang.

References

[1] 迭代器: https://docs.python.org/tutorial/classes.html#iterators

相關焦點

  • AI入門之數據處理(Numpy指南)
    python中的數據操作基本都用numpy來做,在做深度學習的過程一定也繞不過numpy。
  • Numpy入門詳細教程
    numpy入門詳細教程python數據科學基礎庫主要是三劍客:numpy,pandas以及matplotlib,每個庫都集成了大量的方法接口,配合使用功能強大。n數組變形是指對給定數組重新整合各維度大小的過程,numpy封裝了4類基本的變形操作:轉置、展平、尺寸重整和複製。主要方法接口如下:
  • 數據分析之Numpy入門
    目錄1、什麼是numpy2、安裝numpy3、n維數組對象4、數組創建5、數組維度6、數組元素個數7、數組元素數據類型8、改變數組形狀9、數組索引和切片操作10、數組轉換與元素迭代11、數組級聯操作numpy具有以下三大特點2、安裝numpynumpy是一個python庫,所以使用python包管理工具pip或者conda都可以安裝pip install numpy或者conda install numpy
  • numpy入門
    1.一個強大的N維數組對象 ndarray         2.廣播功能函數         3.線性代數、傅立葉變換、隨機數生成等功能二.NumPy安裝方式1:pip install numpy
  • python數據分析:numpy入門
    微信公眾號:學點啥玩點啥小白友好型python數據分析:numpy入門numpy:一個在python中做科學計算的基礎庫,重在數值計算,也是大部分python科學計算庫的基礎庫,多用於在大型、多維數組上執行數值計算。
  • Python+numpy實現矩陣QR分解
    Python擴展庫numpy實現了矩陣QR分解的函數qr(),除本文演示的用法之外,該函數的mode參數還支持另外幾個值,可以通過help(numpy.linalg.qr)查看詳細信息並結合矩陣分析的有關知識進行理解。
  • Python從入門到精通- 什麼是NumPy? (上)
    本文是 Python 系列的第三篇Python
  • 技術圖文:NumPy 的簡單入門教程
    import numpy as npa = np.eye(4)b = np.eye(2, 3)print(a)'''[[ 1.  0.  0.  0.] [ 0.  1.  0.  0.] [ 0.  0.  1.  0.] [ 0.  0.  0.  1.]]
  • python:numpy入門詳細教程
    本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最後分享了個人關於axis和廣播機制的理解。本文知識要點一級菜單numpy:numerical python縮寫,提供了底層基於C語言實現的數值計算庫,與python內置的list和array數據結構相比,其支持更加規範的數據類型和極其豐富的操作接口,速度也更快num
  • numpy入門(隨機數)
    一.常見的隨機函數    1.正態分布import numpy2.24357867] [2.38914975 1.86630216 1.85451615 1.44908467] [1.96599849 3.50036059 1.16862046 0.29284233]]     2.均勻分布import numpy
  • 【入門基礎】Numpy基礎20問
    一言以蔽之,numpy是python中基於數組對象的科學計算庫。提煉關鍵字,可以得出numpy以下三大特點:2、如何安裝numpy?numpy中常用array函數創建數組,傳入列表或元組即可。2]])'''16、numpy中如何進行數值捨入操作?
  • 清晰易懂的Numpy入門教程
    構建的,機器學習包scikit-learn也大量使用了numpy方法。如何通過numpy生成序列數(sequences),重複數(repetitions)和隨機數(random)7. 小結構建numpy數組的方法很多,比較常用的方法是用np.array函數對列表進行轉化。
  • 清晰易懂的 Numpy 入門教程
    構建的,機器學習包scikit-learn也大量使用了numpy方法。如何通過numpy生成序列數(sequences),重複數(repetitions)和隨機數(random)7. 小結構建numpy數組的方法很多,比較常用的方法是用np.array函數對列表進行轉化。
  • 如何系統地學習Python 中 matplotlib, numpy, scipy, pandas?
    下面我們分別為這 4 個庫補充一些學習資源,有些我們之前也分享過:Pandas:Medium 上這篇講解一步步學習 Pandas 的指南:https://medium.com/dunder-data/how-to-learn-pandas-108905ab4955集智主站的《10 分鐘 Pandas 入門》:
  • Numpy入門教程:練習作業01
    【知識點:數組的創建】【答案】import numpy as nparr = np.arange(10)print(arr)# [0 1 2 3 4 5 6 7 8 9]2. 創建一個元素全為True的 3×3 數組。
  • 專欄 | pytorch入門總結指南(1)
    考慮到網上的入門教程多且雜,還是打算自己好好整理一下,系統性的學習一下pytroch。https://github.com/bharathgs/Awesome-pytorch-list總結內容包括了,github上的各類高星tutorial(其實內容上基本差不多大同小異的),pytorch中文手冊,《deep learning with pytorch》《深度學習框架pytorch快速開發與實戰》,《深度學習入門之torch》以及官方文檔,說老實話
  • 介紹 NumPy 的五種玩法
    圖解入門
  • 數據系列教程之numpy( 三)
    數據分析系列教程之numpy( 一)數據分析系列教程之numpy(二)上周講了數據分析入門的前兩節,numpy
  • 60 分鐘入門 PyTorch !這裡有一份新手指南
    PyTorch是最優秀的深度學習框架之一,它簡單優雅,非常適合入門。本文將介紹如何快速學習 PyTorch ,入門深度學習。
  • python數據科學系列:numpy入門詳細教程
    本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最後分享了個人關於axis和廣播機制的理解。本文知識要點一級菜單數組變形是指對給定數組重新整合各維度大小的過程,numpy封裝了4類基本的變形操作:轉置、展平、尺寸重整和複製。主要方法接口如下: