Numpy应用100问
對于從事機(jī)器學(xué)習(xí)的人,python+numpy+scipy+matplotlib是重要的基礎(chǔ);它們基本與matlab相同,而其中最重要的當(dāng)屬numpy;因此,這里列出100個(gè)關(guān)于numpy函數(shù)的問題,希望讀者通過“題海”快速學(xué)好numpy;題中示例可以粘貼運(yùn)行,讀者可以邊執(zhí)行邊看效果;
?
1 ?如何引入numpy?
? import numpy as np(或者from numpy import *)
2 ?如何定義一個(gè)數(shù)組?
?import numpy as np
?x = np.array([[1,2,3],[5,6,7],np.int32])
?y = x[.,1] ? ? ? ? ? ? ? ? ? # 取出x的一列,y = [2,6]
3 實(shí)部和虛部如何提取?
?x = np.array([ 1+2j, 3 + 4j, 5+6j] )
?>> x.imag ? ? ? ? ? ? ? ? ?# x.imag就是x集合中取出的虛部的集合
?>> array([ 2., 4., 6.])
?>> x.imag = [4,8,12] ?# 將集合x.imag一次賦值
4 序列如何排序?
>> x = [3,4,1,2,5]
>> x.argsort()
>> [2,3,0,1,4] ? ? ? ? ? ? # 排序后的序列下標(biāo)
5 何為矩陣的坐標(biāo)軸axis=0或axis=1是啥?
?axis = 0 是指按照列方向,axis = 1是按照行方向(操作)。
6 如何用choose函數(shù)?
>> x = np.arange(25).reshape(5,5) ? ? # 定義矩陣x[5][5]
array(?[
? ?[ 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] ?
? ] )
>>np.choose([1,2,1,2,1],x) ? ? ? ? ? ? ? ?# 選擇x的[1,2,1,2,1]行對應(yīng)數(shù)
>>[5,11,7,13,9]
再如:
a = np.array([[0,1,2],[2,3,0],[1,0,1]])
b = np.array([12,-11,8,7])
np.choose( a, b )
>>?
array([[ 12, -11, 8], ? ? ? ? ? ? ? ? ? ? ? ? ?# 取a的架構(gòu),用b的item填寫
[ 8, 7, 12],
[-11, 12, -11]])
7 ?何為裁剪clips函數(shù)?
是按照一個(gè)范圍剪切數(shù)組;
8 ?何為all和any函數(shù)?
all和any函數(shù)測試兩個(gè)矩陣的元素;當(dāng)全部相等用all,部分相等用any;
示例:
? ?a = ?np.arange(15).reshape(3,5)
? ?b = a.copy()
? ?(a ==b).all()
? ?>>True
9 ?何為argmax和argmin,argsort函數(shù)?
argmax和argmin返回矩陣中,最大元或最校元的下標(biāo);argsort返回矩陣排序的下標(biāo);其中可選坐標(biāo)橫向或縱向;
10 何為compress 函數(shù)?
?a = ?np.arange(15).reshape(3,5)
?np.compress([True,False,True],a,axis=0) ? ?#此處為行方向,取0,2向量構(gòu)成的矩陣
>>
array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14]])
11 如何求共軛復(fù)數(shù)conjugate函數(shù)?
?np.conjugate(1+3j)
>> 1-3j
12 copy函數(shù)是啥?
a = b.copy()或 a = np.copy(b) ? #生成b的副本,賦值給a
13 何為cumprod乘積?
b = array([3,8,9])
np.cumprod(b) ? ? ? ?#該乘積是將[a,b,c]轉(zhuǎn)換成[a,a*b,a*b*c]的乘積
>>[3,24,216]
另:
a = array([[1, 2, 3],
[4, 5, 6]])
np.cunprod(a)
>>
array([ 1, 2, 6, 24, 120, 720])
14 何為cumsum和?
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
cumsum(b) ? ? ? ? ? ? ? ? ? ? ? ? ? ?#累計(jì)的和數(shù)列,類似于階乘的數(shù)列
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66])
15 何為diagonal函數(shù)?
求一個(gè)矩陣的主對角元素組成的數(shù)列。
a = array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
diagonal(a)
>>
array([0,6,12) ? ? #注意,不論是否方陣;
?
16 何為dot函數(shù)?
dot是兩個(gè)矩陣相乘的函數(shù),當(dāng)矩陣為一維時(shí),是向量內(nèi)積,二維的是矩陣相乘;
?
17何為mean函數(shù)?
就是對矩陣所有元求平均;
?
18何為nonzero函數(shù)?
nonzero(a)返回a中非零數(shù)據(jù)項(xiàng)的下標(biāo);
?a =?array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 0, 11, 12, 0, 14]])
nonzero(a)
?>>
(array([0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2], dtype=int64),
array([1, 2, 3, 4, 0, 1, 2, 3, 4, 1, 2, 4], dtype=int64))
另:(a〉3).nonzero() ? ? #表示大于3的數(shù)的下標(biāo)
?
19 何為prod函數(shù)?
就是將矩陣所有元素相乘;
a = array([ 0, 1, 2, 3, 4])
prod(a)
>> 24
?
20 何為ptp函數(shù)?
是指矩陣按照某個(gè)軸上最大值和最小值得差,即數(shù)據(jù)gap范圍;
?
21 何為put函數(shù)?
將指定下標(biāo)的元素,賦值為其它值;
?
22 何為ravel函數(shù)?
將矩陣扁平化,即轉(zhuǎn)換成一維排列;參見ndarray的flat和flaten函數(shù);
?
23 何為repeat函數(shù)?
將矩陣每個(gè)元素重復(fù)n遍,放入一維序列中;
a = array([[1,2],[4,5])
np.repeat(a,2) ? ?#將a的元素重復(fù)2次
>> array([1,1,2,2,4,4,5,5])
?
24 何為reshape函數(shù)?
將矩陣所有元素重新排列,構(gòu)成新的矩陣;數(shù)據(jù)不變;
如:a = np.arange(12).reshape(3,4)
?
25 何為resize函數(shù)?
構(gòu)成新的矩陣;數(shù)據(jù)可變;
a = np.array([[1,2,3]])
np.resize(a,[2,3])
>>
array([[1,2,3],[1,2,3]])
?
26 函數(shù)searchsorted的作用
若存在一個(gè)數(shù),和一個(gè)排序向量;求該數(shù)在排序向量對應(yīng)的下標(biāo);
np.searchsorted([1,2,3,4,5], 3)
>>
2
np.searchsorted([1,2,3,4,5], [3,-1,8])
>>
[2,0,5]
?
27 函數(shù)sort的用法
對矩陣排序,分兩種:軸排序,扁平(無軸)排序
>>>?a = np.array([[1,4],[3,1]])
>>>?np.sort(a) ? ? ? ? ? ? ? ? ?# sort along the last axis
array([[1, 4], ? ? ? ? ? ?
[1, 3]])
>>>?np.sort(a, axis=None)?# sort the flattened array
array([1, 1, 3, 4])
>>>?np.sort(a, axis=0) ? ? ?# sort along the first axis
array([[1, 1],
[3, 4]])
?
28 函數(shù)squeeze(a)如何用?
將一個(gè)具有冗余多維的向量,壓縮成一維的向量;
>>>?x = np.array([[[0], [1], [2]]])
>>>?x.shape
(1, 3, 1)
>>>?np.squeeze(x).shape
(3,)
?
29 函數(shù)std()用法?
對矩陣各元素,求出標(biāo)準(zhǔn)均方差;
?
30 函數(shù)sum()用法?
對矩陣的所有函數(shù)進(jìn)行求和。
>>>?np.sum([0.5, 1.5])
2.0
>>>?np.sum([0.5, 0.7, 0.2, 1.5], dtype=np.int32)
1
>>>?np.sum([[0, 1], [0, 5]])
6
>>>?np.sum([[0, 1], [0, 5]], axis=0)
array([0, 6])
>>>?np.sum([[0, 1], [0, 5]], axis=1)
array([1, 5])
?
31 函數(shù)swapaxes的用法?
??swapaxes(): 將n個(gè)維度中任意兩個(gè)維度(坐標(biāo)軸)進(jìn)行調(diào)換
?
32 函數(shù)take的用法?
?numpy.take(a,?indices,?axis=None,?out=None,?mode=’raise’)
該函數(shù)從a中取出indices下標(biāo)所對應(yīng)的元素;
>>>?a = [4, 3, 5, 7, 6, 8]
>>>?indices = [0, 1, 4]
>>>?np.take(a, indices)
array([4, 3, 6])
?
33 函數(shù)trace的用途?
numpy.trace(a,?offset=0,?axis1=0,?axis2=1,?dtype=None,?out=None)
求矩陣對角線元素的和;
?
34 矩陣的transpose函數(shù)?
numpy.transpose(a,?axes=None)
上述給出a矩陣的轉(zhuǎn)置矩陣;
?
35 函數(shù)var是什么?
numpy.var(a,?axis=None,?dtype=None,?out=None,?ddof=0)
是求出某個(gè)軸向的方差;
?
36 何為矩陣的切割Slicing?
就是將矩陣通過[i:j:k]轉(zhuǎn)換的新矩陣,i是起始下標(biāo),j是終了下標(biāo),k是步長;這些下標(biāo)都能為負(fù);
如:
>>>?x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>?x[1:7:2]
array([1, 3, 5])
>>>?x[1:7:1]
array([1, 2, 3, 4, 5, 6])
?
?37 如何求一個(gè)向量的轉(zhuǎn)置?
a = np.array([1,2,3]) 的轉(zhuǎn)置依舊是它本身
b = np.array([ [1,2,3] ])的轉(zhuǎn)置是
array [[1],
? ? ? ? ?[2],
? ? ? ? ?[3]?]
要想從a求出列向轉(zhuǎn)置需要:
a[:,np.newaxis ] 這個(gè)語法,切記之
?
38 如何求行向量和列向量之和?
a = np.array([1,2,3])
b =?np.array([[x],[y]])
a + b =?array([ ?[1+x,2+x,3+x], [1+y,2+y,3+y] ])這就是規(guī)則!
?
39 如何將數(shù)據(jù)從文本文件讀入?
numpy.loadtxt(fname,?dtype=<type 'float'>,?comments='#',?delimiter=None,?converters=None,?skiprows=0,usecols=None,?unpack=False,?ndmin=0)[source]
?例子:
V1,V2 = np.loadtxt('datas.txt',dtype='float',delimiter=',',skiprows =1,usecols=[1,2],unpack = True)
參數(shù)解釋:'datas.txt' ---文件名
dtype='float' ---數(shù)據(jù)格式
delimiter=',' ---分隔符逗號
skiprows =1 ---跳過第一行
usecols=[1,2] ---選第1,2列讀出
unpack = True ---讀出兩列將拆開,分別給V1和V2
converters=None ? ---缺省數(shù)據(jù)用什么填充
?
40 如何將數(shù)據(jù)寫出到文本文件?
numpy.savetxt(fname,?X,?fmt='%.18e',?delimiter=' ',?newline='\n',?header='',?footer='',?comments='# ')fname?---文件名
X ---寫出的數(shù)據(jù)表格
fmt='%.18e' ??---數(shù)據(jù)格式
delimiter=',' ? ---分隔符逗號
newline='\n' ? ----換行
newline='\n' ? ----表頭
footer='' ? ? ? ?----表尾?
comments='# ' ? ?注釋
?
41?linspace和arange區(qū)別?
x = np.linspace(0, 4*np.pi, 100) 在0-4pi中間有100個(gè)點(diǎn)
x = np.arange(0, 4*np.pi, 2) 在0-4pi中間每兩個(gè)點(diǎn)抽樣一次
?
42 newaxis如何使用?
關(guān)于newaxis是很難理解的東西,而矩陣變換中又常用,這里用形式表現(xiàn)之:
1:a = array([A,B,C]) ? ? 這里ABC可能是數(shù)列,也可能是單獨(dú)數(shù),當(dāng)使用a[:,newaxis]時(shí),一定是如下格式:
將a中的最外層不管,將次外層看成獨(dú)立元素,將他們加上“[]”,然后進(jìn)行行排列
a[:,newaxis]等價(jià)于
[[A],
[B],
[C]]
2:a = array([A,B,C]) ? ? 這里ABC可能是數(shù)列,也可能是單獨(dú)數(shù),當(dāng)使用a[newaxis,:]時(shí),一定是如下格式:
在a上加外擴(kuò)號:
a[newaxis,:] = array([ [A,B,C] ])
舉例:
?>>>print a.shape
(3L, 3L)
b =?a[:,newaxis]
>>>print a[:,newaxis]
[[[0 1 3]]
[[4 5 6]]
[[7 8 9]]]
?>>>print b.shape
(3L, 1L, 3L) ? ? ? ?//意思為三行,每行是[1,3]的矩陣
當(dāng)?b =?a[ newaxis,:]
>>>print b
[[[0 1 3]
[4 5 6]
[7 8 9]]]
>>>print b.shape
(1L, 3L, 3L) ? ? ? //意思為1行,內(nèi)部是[3,3]的矩陣;
?
43 如何構(gòu)造一個(gè)hilbert矩陣?
構(gòu)造10X10的希爾伯特矩陣,參考第42問,第38問:
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
?
44 何為logspace?
s = np.logspace(2.0, 3.0, num=3,base =4)
等價(jià)于
r =np.linspace(2,3,3)
l = 4**r
?
45 何為numpy.meshgrid(x,?y)?
用兩個(gè)1維向量變換出兩個(gè)矩陣X,Y,其規(guī)則如下:
對于向量?x,?y?,長度?Nx=len(x)?和?Ny=len(y), 返回矩陣X,?Y?其中X?和?Y?形狀shape=?(Ny,?Nx)?,填充數(shù)據(jù)為?x的Ny重復(fù), 后者為?y的Nx次重復(fù).
例:
>>> X, Y = np.meshgrid([1,2,3], [4,5,6,7]) >>> X array([[1, 2, 3],[1, 2, 3],[1, 2, 3],[1, 2, 3]]) >>> Y array([[4, 4, 4],[5, 5, 5],[6, 6, 6],[7, 7, 7]])?46 何為mgrid?
也是一種從向量產(chǎn)生雙矩陣的方法,如下:
>>>?np.mgrid[0:5,0:5]
array([[[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4]],
[[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]])
>>>?np.mgrid[-1:1:5j]
array([-1. , -0.5, 0. , 0.5, 1. ])
?
47 如何numpy.ravel實(shí)現(xiàn)矩陣扁平化?
例:
>>>?x?=?np.array([[1,?2,?3],?[4,?5,?6]])?>>>?print(np.ravel(x))?[1 2 3 4 5 6]
48 如何理解np.nditer(a)?
請看代碼:
>>> a = np.arange(6).reshape(2,3) >>> for x in np.nditer(a): ... print x, ... 0 1 2 3 4 5上述代碼中,np.nditer(a)將a的元素扁平化后存入對象np.nditer中,然后讀取出來,注意np.nditer不是個(gè)列表,是對象;不可用print?np.nditer(a)打印出來;用時(shí)要注意;
?
49 如何實(shí)現(xiàn)數(shù)組元素?zé)o差別函數(shù)變換?
所謂無差別函數(shù)操作就是將每一個(gè)元素按照同樣變換方式,并寫回;比如a中的元素都乘2,這是比較簡單的變換,常規(guī)通過a *=2就能完成,但是變換如果很復(fù)雜,比如每個(gè)元素求自然對數(shù),就無法簡單表示,因此需要下列代碼完成:
>>> a = np.arange(6).reshape(2,3) >>> a array([[0, 1, 2],[3, 4, 5]]) >>> for x in np.nditer(a, op_flags=['readwrite']): ... x[...] = 2 * x ... >>> a array([[ 0, 2, 4],[ 6, 8, 10]])注意打開讀寫標(biāo)志op_flags=['readwrite'],x[...]不可寫成x;因?yàn)閤是從對象中讀出的臨時(shí)變量;而x[...]是當(dāng)前臨時(shí)變量x所面向的數(shù)組內(nèi)地址,用以指明當(dāng)前x寫到哪里。
?
50 什么是class?numpy.ndenumerate(arr)?
ndenumerate和nditer類似,只是ndenumerate不返回元素的值,返回的全是下標(biāo);下標(biāo)有兩組,一組是數(shù)組的(Nx和Ny)另一組是nditer的順序標(biāo)號;與nditer同,不可用print?np.ndenumerate(a)打印;
>>> a = np.arange(6).reshape(2,3)>>> for index, x in np.ndenumerate(a):...:???? print(index, x)...:?? ? ((0, 0), 0) ((0, 1), 1) ((0, 2), 2) ((1, 0), 3) ((1, 1), 4) ((1, 2), 5)?
51 如何理解np的mean函數(shù)的axis?
關(guān)于numpy mean函數(shù)的axis參數(shù),理解多維矩陣的"求和"、"平均"操作確實(shí)太惡心了,numpy提供的函數(shù)里還有一堆參數(shù),搞得暈頭轉(zhuǎn)向的,這里做個(gè)筆記,提醒一下自己, 下面是例程
import numpy as np X = np.array([[1, 2], [4, 5], [7, 8]]) print np.mean(X, axis=0, keepdims=True) print np.mean(X, axis=1, keepdims=True)結(jié)果是分別是
[[ 1.5][[ 4. 5.]] [ 4.5] [ 7.5]]我個(gè)人比較raw的認(rèn)識就是,axis=0,那么輸出矩陣是1行,求每一列的平均(按照每一行去求平均);axis=1,輸出矩陣是1列,求每一行的平均(按照每一列去求平均)。還可以這么理解,axis是幾,那就表明哪一維度被壓縮成1。
再舉個(gè)更復(fù)雜點(diǎn)的例子,比如我們輸入為batch = [128, 28, 28],可以理解為batch=128,圖片大小為28×28像素,我們相求這128個(gè)圖片的均值,應(yīng)該這么寫
m = np.mean(batch, axis=0)輸出結(jié)果m的shape為(28,28),就是這128個(gè)圖片在每一個(gè)像素點(diǎn)平均值。
?
52 矩陣相關(guān)計(jì)算如何實(shí)現(xiàn)?
??? 1)定義:
a = np.matrix([ [1, 2, 3, 4], [5, 5, 6, 8],[7, 9, 9, 1],[4, 6, 7, 1] ])???? 2)加法減法
#矩陣加減法:
e = a + a? #or??? e = a - a
??????????????? e = a + a轉(zhuǎn)置?????#or??? e = a.轉(zhuǎn)置+ a????? a為向量時(shí)這里轉(zhuǎn)置是 a[:,np.newaxis ] 這個(gè)語法,切記之
??? 3)乘法
#矩陣乘法: b = a * a #not matrix multiplication! #or c = np.dot(a, a) #matrix multiplication #or d = a np.dot(a, a, d) #matrix multiplication??? 4)轉(zhuǎn)置矩陣(transpose)
g = a.transpose() 或h = a.T 等價(jià)
?
??? 5)逆矩陣(inverse)
???????????????? f = np.linalg.inv(a)? 或??? f = a.I
???????????????? f = a ** (-1)? 求各元素倒數(shù),不是求逆
??????6)行列式(determinant)
???????? j = np.linalg.det(a)
?
????7)伴隨矩陣(adjoint)
??????? #(need more test)
???????? m = np.dot(np.linalg.det(a), np.linalg.inv(a)) # A-1 = A'' / |A| ?==>???A''=?A-1|A| ?
?
??? 8)矩陣范數(shù)(matrix norms)
????????? k = np.linalg.norms(a)
?53 如何初始化矩陣?
?????? Python使用NumPy包完成了對N-維數(shù)組的快速便捷操作。使用這個(gè)包,需要導(dǎo)入numpy。 SciPy包以NumPy包為基礎(chǔ),大大的擴(kuò)展了numpy的能力。為了使用的方便,scipy包在最外層名字空間中包括了所有的numpy內(nèi)容,因此只要導(dǎo)入了scipy,不必在單獨(dú)導(dǎo)入numpy了!但是為了明確哪些是numpy中實(shí)現(xiàn)的,哪些是scipy中實(shí)現(xiàn)的,本文還是進(jìn)行了區(qū)分。以下默認(rèn)已經(jīng):import numpy as np 以及 impor scipy as sp
????? 下面簡要介紹Python和MATLAB處理數(shù)學(xué)問題的幾個(gè)不同點(diǎn)。1.MATLAB的基本是矩陣,而numpy的基本類型是多為數(shù)組,把matrix看做是array的子類。2.MATLAB的索引從1開始,而numpy從0開始。
1.建立矩陣
a1=np.array([1,2,3],dtype=int)???#建立一個(gè)一維數(shù)組,數(shù)據(jù)類型是int。也可以不指定數(shù)據(jù)類型,使用默認(rèn)。幾乎所有的數(shù)組建立函數(shù)都可以指定數(shù)據(jù)類型,即dtype的取值。
a2=np.array([[1,2,3],[2,3,4]])???#建立一個(gè)二維數(shù)組。此處和MATLAB的二維數(shù)組(矩陣)的建立有很大差別。
同樣,numpy中也有很多內(nèi)置的特殊矩陣:
b1=np.zeros((2,3))????#生成一個(gè)2行3列的全0矩陣。注意,參數(shù)是一個(gè)tuple:(2,3),所以有兩個(gè)括號。完整的形式為:zeros(shape,dtype=)。相同的結(jié)構(gòu),有ones()建立全1矩陣。empty()建立一個(gè)空矩陣,使用內(nèi)存中的隨機(jī)值來填充這個(gè)矩陣。
b2=identity(n)???#建立n*n的單位陣,這只能是一個(gè)方陣。
b3=eye(N,M=None,k=0)????#建立一個(gè)對角線是1其余值為0的矩陣,用k指定對角線的位置。M默認(rèn)None。
此外,numpy中還提供了幾個(gè)like函數(shù),即按照某一個(gè)已知的數(shù)組的規(guī)模(幾行幾列)建立同樣規(guī)模的特殊數(shù)組。這樣的函數(shù)有zeros_like()、empty_like()、ones_like(),它們的參數(shù)均為如此形式:zeros_like(a,dtype=),其中,a是一個(gè)已知的數(shù)組。
c1=np.arange(2,3,0.1)???#起點(diǎn),終點(diǎn),步長值。含起點(diǎn)值,不含終點(diǎn)值。
c2=np.linspace(1,4,10)????#起點(diǎn),終點(diǎn),區(qū)間內(nèi)點(diǎn)數(shù)。起點(diǎn)終點(diǎn)均包括在內(nèi)。同理,有l(wèi)ogspace()函數(shù)
d1=np.linalg.companion(a)????#伴隨矩陣
d2=np.linalg.triu()/tril()???#作用同MATLAB中的同名函數(shù)
e1=np.random.rand(3,2)????#產(chǎn)生一個(gè)3行2列的隨機(jī)數(shù)組。同一空間下,有randn()/randint()等多個(gè)隨機(jī)函數(shù)
fliplr()/flipud()/rot90()????#功能類似MATLAB同名函數(shù)。
xx=np.roll(x,2)???#roll()是循環(huán)移位函數(shù)。此調(diào)用表示向右循環(huán)移動(dòng)2位。
2.數(shù)組的特征信息
先假設(shè)已經(jīng)存在一個(gè)N維數(shù)組X了,那么可以得到X的一些屬性,這些屬性可以在輸入X和一個(gè).之后,按tab鍵查看提示。這里明顯看到了Python面向?qū)ο蟮奶卣鳌?/p>
X.flags????#數(shù)組的存儲情況信息。
X.shape????#結(jié)果是一個(gè)tuple,返回本數(shù)組的行數(shù)、列數(shù)、……
X.ndim???#數(shù)組的維數(shù),結(jié)果是一個(gè)數(shù)
X.size????#數(shù)組中元素的數(shù)量
X.itemsize????#數(shù)組中的數(shù)據(jù)項(xiàng)的所占內(nèi)存空間大小
X.dtype????#數(shù)據(jù)類型
X.T???#如果X是矩陣,發(fā)揮的是X的轉(zhuǎn)置矩陣
X.trace()????#計(jì)算X的跡
np.linalg.det(a)???#返回的是矩陣a的行列式
np.linalg.norm(a,ord=None)????#計(jì)算矩陣a的范數(shù)
np.linalg.eig(a)????#矩陣a的特征值和特征向量
np.linalg.cond(a,p=None)????#矩陣a的條件數(shù)
np.linalg.inv(a)????#矩陣a的逆矩陣
3.矩陣分解
常見的矩陣分解函數(shù),numpy.linalg均已經(jīng)提供。比如cholesky()/qr()/svd()/lu()/schur()等。某些算法為了方便計(jì)算或者針對不同的特殊情況,還給出了多種調(diào)用形式,以便得到最佳結(jié)果。
4.矩陣運(yùn)算
np.dot(a,b)用來計(jì)算數(shù)組的點(diǎn)積;vdot(a,b)專門計(jì)算矢量的點(diǎn)積,和dot()的區(qū)別在于對complex數(shù)據(jù)類型的處理不一樣;innner(a,b)用來計(jì)算內(nèi)積;outer(a,b)計(jì)算外積。
專門處理矩陣的數(shù)學(xué)函數(shù)在numpy的子包linalg中定義。比如 np.linalg.logm(A)計(jì)算矩陣A的對數(shù)。可見,這個(gè)處理和MATLAB是類似的,使用一個(gè)m后綴表示是矩陣的運(yùn)算。在這個(gè)空間內(nèi)可以使用的有cosm()/sinm()/signm()/sqrtm()等。其中常規(guī)exp()對應(yīng)有三種矩陣形式:expm()使用Pade近似算法、 expm2()使用特征值分析算法、expm3()使用泰勒級數(shù)算法。在numpy中,也有一個(gè)計(jì)算矩陣的函數(shù):funm(A,func)。
5.索引
numpy中的數(shù)組索引形式和Python是一致的。如:
x=np.arange(10)
print x[2]????#單個(gè)元素,從前往后正向索引。注意下標(biāo)是從0開始的。
print x[-2]????#從后往前索引。最后一個(gè)元素的下標(biāo)是-1
print x[2:5]????#多個(gè)元素,左閉右開,默認(rèn)步長值是1
print x[:-7]????#多個(gè)元素,從后向前,制定了結(jié)束的位置,使用默認(rèn)步長值
print x[1:7:2]???#指定步長值
x.shape=(2,5)????#x的shape屬性被重新賦值,要求就是元素個(gè)數(shù)不變。2*5=10
print x[1,3]????#二維數(shù)組索引單個(gè)元素,第2行第4列的那個(gè)元素
print x[0]???#第一行所有的元素
y=np.arange(35).reshape(5,7)????#reshape()函數(shù)用于改變數(shù)組的維度
print y[1:5:2,::2]????#選擇二維數(shù)組中的某些符合條件的元素
?
54 矩陣加法的注意事項(xiàng)?
a =np.array([1,3,4,5,6]) s =np.array([[13],[4],[6]]) print( a ) print (s) print(a+s) #此處a和s可以交換結(jié)果:
?[1 3 4 5 6]
?[[13]
?[ 4]
?[ 6]]
?[[14 16 17 18 19]
?[ 5? 7? 8? 9 10]
?[ 7? 9 10 11 12]]
?
55 logspace指數(shù)序列的產(chǎn)生?
>>> a = np.logspace(0,9,10,base=2)
>>> a
array([ ? 1., ? ?2., ? ?4., ? ?8., ? 16., ? 32., ? 64., ?128., ?256., ?512.])
每一項(xiàng)的形態(tài)是base=2的0-9次方序列
?
?56 numpy如何產(chǎn)生等比數(shù)列?
| 1 2 | import numpy?as?npnp.logspace(2.0, 3.0, num=4) array([? 100.??????? ,?? 215.443469? ,?? 464.15888336,? 1000.??????? ]) |
?
57 如何生成復(fù)雜矩陣?
通過形式函數(shù)是現(xiàn),比如:
| 1 | b = np.fromfunction(lambda x,y,z:x*100+y*10+z,(3,3,3),dtype=int)? |
?
?58 如何遍歷數(shù)組?
分三個(gè)辦法:
第一種,最常用的,通過for in遍歷數(shù)組?
| 1 2 3 4 | colours = ["red","green","blue"] ?? for?colour?in?colours: ????print colour |
第二種,先獲得數(shù)組的長度,然后根據(jù)索引號遍歷數(shù)組,同時(shí)輸出索引號
| 1 2 3 | colours = ["red","green","blue"] ?for?i?in?range(0, len(colours)): print i, colour[i] |
?第三種 通過迭代器完成
for element in b.flat: print element,?
59 如何定義等距序列numpy.linspace?
函數(shù)原型numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
??????? start : scalar(標(biāo)量值),表明序列起始數(shù)
??????? stop : scalar(標(biāo)量值),序列終結(jié)位置,?若endpoint=True,序列包含end;若endpoint=False,序列不包含end;
? num:int 序列中元素個(gè)數(shù)
??????? endpoint : bool 如果是真,則一定包括stop,如果為False,一定不會(huì)有stop
??????? retstep : bool 如果真,將間隔步長也返回,否則,不返回步長
??????? dtype:數(shù)據(jù)的類型(int32,float32)
實(shí)例:
>>> import numpy as np
>>> np.linspace(1, 10, 10)
array([ ?1., ? 2., ? 3., ? 4., ? 5., ? 6., ? 7., ? 8., ? 9., ?10.])
>>> np.linspace(1, 10, 10, endpoint = False)
array([ 1. , ?1.9, ?2.8, ?3.7, ?4.6, ?5.5, ?6.4, ?7.3, ?8.2, ?9.1])
In [4]: np.linspace(1, 10, 10, endpoint = False, retstep= True)
Out[4]: (array([ 1. , ?1.9, ?2.8, ?3.7, ?4.6, ?5.5, ?6.4, ?7.3, ?8.2, ?9.1]), 0.9)
?
?60 向量和矩陣的關(guān)系(newaxis改變)?
向量無論如何轉(zhuǎn)置,都是它本身;如:
s_data = np.linspace(-1,1,30) r_data = np.transpose(s_data)在此,s_data和r_data 兩個(gè)向量完全一樣。而x_data = np.linspace(-1,1,30)[:,np.newaxis] y_data = np.linspace(-1,1,30)[np.newaxis,:] 就成了[30X1]和[1X30]的矩陣。61 如何求矩陣的逆矩陣? A = np.array( [[1,-2,1],[0,2,-1],[1,1,-2]] ) B = np.linalg.inv( A ) print(B)62 求矩陣行列式 A = np.array( [[1,-2,1],[0,2,-1],[1,1,-2]] ) B = np.linalg.det( A ) print(B)63 獲取張量的最小量對應(yīng)的序號 當(dāng)axis=None時(shí),為張量展開成一維單列的序號,否則就是行向,或列向的若干序號。 a = np.array([ [7,5,6],[5,4,2],[7,3,6]]) print(np.argmin(a,axis=None)) 64 將某個(gè)張量矩陣寫成二進(jìn)制的位張量np.unpackbits a?=?np.array([[2],?[7],?[23]],?dtype=np.uint8) >>> a array([[ 2],[ 7],[23]], dtype=uint8) b = np.unpackbits(a, axis=1) >>> b array([[0, 0, 0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 1, 1, 1],[0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8) 65 將某個(gè)張量改變形狀,但數(shù)值不變 numpy.reshape(a,?newshape,?order='C') >>> a = np.array([[1,2,3], [4,5,6]]) >>> np.reshape(a, 6) array([1, 2, 3, 4, 5, 6]) >>> np.reshape(a, 6, order='F') array([1, 4, 2, 5, 3, 6]) >>> np.reshape(a, (3,-1)) # the unspecified value is inferred to be 2 array([[1, 2],[3, 4],[5, 6]]) 66 numpy.matrix系列函數(shù)| matrix.T | Returns the transpose of the matrix. |
| matrix.H | Returns the (complex) conjugate transpose of?self. |
| matrix.I | Returns the (multiplicative) inverse of invertible?self. |
| matrix.A | Return?self?as an?ndarray?object. |
Memory-mapped file arrays
>>> a = memmap('newfile.dat', dtype=float, mode='w+', shape=1000) >>> a[10] = 10.0 >>> a[30] = 30.0 >>> del a >>> b = fromfile('newfile.dat', dtype=float) >>> print b[10], b[30] 10.0 30.0 >>> a = memmap('newfile.dat', dtype=float) >>> print a[10], a[30] 10.0 30.0?
原文地址:https://www.cnblogs.com/gongdiwudu/p/6207975.html
總結(jié)
以上是生活随笔為你收集整理的Numpy应用100问的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]关于 UTC , GMT 和 BS
- 下一篇: 数学_矩阵求逆/伪逆计算