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.clipimport 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.averageimport 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.cumsumimport 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] ])
# --->[2 5 9 14 20 27 35 44 54 65 77 90]
print('矩陣前n項累加',np.cumsum(A))
np.diffimport 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], ---> [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.splitimport 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