對於從事機器學習的人,python+numpy+scipy+matplotlib是重要的基礎;它們基本與matlab相同,而其中最重要的當屬numpy;因此,這里列出100個關於numpy函數的問題,希望讀者通過“題海”快速學好numpy;題中示例可以粘貼運行,讀者可以邊執行邊看效果;
1 如何引入numpy?
import numpy as np(或者from numpy import *)
2 如何定義一個數組?
import numpy as np
x = np.array([[1,2,3],[5,6,7],np.int32])
y = x[.,1] # 取出x的一列,y = [2,6]
3 實部和虛部如何提取?
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] # 排序后的序列下標
5 何為矩陣的坐標軸axis=0或axis=1是啥?
axis = 0 是指按照列方向,axis = 1是按照行方向(操作)。
6 如何用choose函數?
>> 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]行對應數
>>[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的架構,用b的item填寫
[ 8, 7, 12],
[-11, 12, -11]])
7 何為裁剪clips函數?
是按照一個范圍剪切數組;
8 何為all和any函數?
all和any函數測試兩個矩陣的元素;當全部相等用all,部分相等用any;
示例:
a = np.arange(15).reshape(3,5)
b = a.copy()
(a ==b).all()
>>True
9 何為argmax和argmin,argsort函數?
argmax和argmin返回矩陣中,最大元或最校元的下標;argsort返回矩陣排序的下標;其中可選坐標橫向或縱向;
10 何為compress 函數?
a = np.arange(15).reshape(3,5)
np.compress([True,False,True],a,axis=0) #此處為行方向,取0,2向量構成的矩陣
>>
array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14]])
11 如何求共軛復數conjugate函數?
np.conjugate(1+3j)
>> 1-3j
12 copy函數是啥?
a = b.copy()或 a = np.copy(b) #生成b的副本,賦值給a
13 何為cumprod乘積?
b = array([3,8,9])
np.cumprod(b) #該乘積是將[a,b,c]轉換成[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) #累計的和數列,類似於階乘的數列
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66])
15 何為diagonal函數?
求一個矩陣的主對角元素組成的數列。
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函數?
dot是兩個矩陣相乘的函數,當矩陣為一維時,是向量內積,二維的是矩陣相乘;
17何為mean函數?
就是對矩陣所有元求平均;
18何為nonzero函數?
nonzero(a)返回a中非零數據項的下標;
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的數的下標
19 何為prod函數?
就是將矩陣所有元素相乘;
a = array([ 0, 1, 2, 3, 4])
prod(a)
>> 24
20 何為ptp函數?
是指矩陣按照某個軸上最大值和最小值得差,即數據gap范圍;
21 何為put函數?
將指定下標的元素,賦值為其它值;
22 何為ravel函數?
將矩陣扁平化,即轉換成一維排列;參見ndarray的flat和flaten函數;
23 何為repeat函數?
將矩陣每個元素重復n遍,放入一維序列中;
a = array([[1,2],[4,5])
np.repeat(a,2) #將a的元素重復2次
>> array([1,1,2,2,4,4,5,5])
24 何為reshape函數?
將矩陣所有元素重新排列,構成新的矩陣;數據不變;
如:a = np.arange(12).reshape(3,4)
25 何為resize函數?
構成新的矩陣;數據可變;
a = np.array([[1,2,3]])
np.resize(a,[2,3])
>>
array([[1,2,3],[1,2,3]])
26 函數searchsorted的作用
若存在一個數,和一個排序向量;求該數在排序向量對應的下標;
np.searchsorted([1,2,3,4,5], 3)
>>
2
np.searchsorted([1,2,3,4,5], [3,-1,8])
>>
[2,0,5]
27 函數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 函數squeeze(a)如何用?
將一個具有冗余多維的向量,壓縮成一維的向量;
>>> x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
>>> np.squeeze(x).shape
(3,)
29 函數std()用法?
對矩陣各元素,求出標准均方差;
30 函數sum()用法?
對矩陣的所有函數進行求和。
>>> 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 函數swapaxes的用法?
swapaxes(): 將n個維度中任意兩個維度(坐標軸)進行調換
32 函數take的用法?
numpy.take(a, indices, axis=None, out=None, mode=’raise’)
該函數從a中取出indices下標所對應的元素;
>>> a = [4, 3, 5, 7, 6, 8]
>>> indices = [0, 1, 4]
>>> np.take(a, indices)
array([4, 3, 6])
33 函數trace的用途?
numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None)
求矩陣對角線元素的和;
34 矩陣的transpose函數?
numpy.transpose(a, axes=None)
上述給出a矩陣的轉置矩陣;
35 函數var是什么?
numpy.var(a, axis=None, dtype=None, out=None, ddof=0)
是求出某個軸向的方差;
36 何為矩陣的切割Slicing?
就是將矩陣通過[i:j:k]轉換的新矩陣,i是起始下標,j是終了下標,k是步長;這些下標都能為負;
如:
>>> 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 如何求一個向量的轉置?
a = np.array([1,2,3]) 的轉置依舊是它本身
b = np.array([ [1,2,3] ])的轉置是
array [[1],
[2],
[3] ]
要想從a求出列向轉置需要:
a[:,np.newaxis ] 這個語法,切記之
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] ])這就是規則!
39 如何將數據從文本文件讀入?
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)
參數解釋:
'datas.txt' ---文件名
dtype='float' ---數據格式
delimiter=',' ---分隔符逗號
skiprows =1 ---跳過第一行
usecols=[1,2] ---選第1,2列讀出
unpack = True ---讀出兩列將拆開,分別給V1和V2
converters=None ---缺省數據用什么填充
40 如何將數據寫出到文本文件?
numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ')
fname ---文件名
X ---寫出的數據表格
fmt='%.18e' ---數據格式
delimiter=',' ---分隔符逗號
newline='\n' ----換行
newline='\n' ----表頭
footer='' ----表尾
comments='# ' 注釋
41 linspace和arange區別?
x = np.linspace(0, 4*np.pi, 100) 在0-4pi中間有100個點
x = np.arange(0, 4*np.pi, 2) 在0-4pi中間每兩個點抽樣一次
42 newaxis如何使用?
關於newaxis是很難理解的東西,而矩陣變換中又常用,這里用形式表現之:
1:a = array([A,B,C]) 這里ABC可能是數列,也可能是單獨數,當使用a[:,newaxis]時,一定是如下格式:
將a中的最外層不管,將次外層看成獨立元素,將他們加上“[]”,然后進行行排列
a[:,newaxis]等價於
[[A],
[B],
[C]]
2:a = array([A,B,C]) 這里ABC可能是數列,也可能是單獨數,當使用a[newaxis,:]時,一定是如下格式:
在a上加外擴號:
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]的矩陣
當 b = a[ newaxis,:]
>>>print b
[[[0 1 3]
[4 5 6]
[7 8 9]]]
>>>print b.shape
(1L, 3L, 3L) //意思為1行,內部是[3,3]的矩陣;
43 如何構造一個hilbert矩陣?
構造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)
等價於
r =np.linspace(2,3,3)
l = 4**r
45 何為numpy.meshgrid(x, y)?
用兩個1維向量變換出兩個矩陣X,Y,其規則如下:
對於向量 x, y ,長度 Nx=len(x) 和 Ny=len(y), 返回矩陣X, Y 其中X 和 Y 形狀shape= (Ny, Nx) ,填充數據為 x的Ny重復, 后者為 y的Nx次重復.
例:
>>> 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?
也是一種從向量產生雙矩陣的方法,如下:
>>> 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實現矩陣扁平化?
例:
>>> 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不是個列表,是對象;不可用print np.nditer(a)打印出來;用時要注意;
49 如何實現數組元素無差別函數變換?
所謂無差別函數操作就是將每一個元素按照同樣變換方式,並寫回;比如a中的元素都乘2,這是比較簡單的變換,常規通過a *=2就能完成,但是變換如果很復雜,比如每個元素求自然對數,就無法簡單表示,因此需要下列代碼完成:
>>> 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]])
注意打開讀寫標志op_flags=['readwrite'],x[...]不可寫成x;因為x是從對象中讀出的臨時變量;而x[...]是當前臨時變量x所面向的數組內地址,用以指明當前x寫到哪里。
50 什么是class numpy.ndenumerate(arr)?
ndenumerate和nditer類似,只是ndenumerate不返回元素的值,返回的全是下標;下標有兩組,一組是數組的(Nx和Ny)另一組是nditer的順序標號;與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函數的axis?
關於numpy mean函數的axis參數,理解多維矩陣的"求和"、"平均"操作確實太惡心了,numpy提供的函數里還有一堆參數,搞得暈頭轉向的,這里做個筆記,提醒一下自己, 下面是例程
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)
結果是分別是
[[ 1.5] [[ 4. 5.]] [ 4.5] [ 7.5]]
我個人比較raw的認識就是,axis=0,那么輸出矩陣是1行,求每一列的平均(按照每一行去求平均);axis=1,輸出矩陣是1列,求每一行的平均(按照每一列去求平均)。還可以這么理解,axis是幾,那就表明哪一維度被壓縮成1。
再舉個更復雜點的例子,比如我們輸入為batch = [128, 28, 28],可以理解為batch=128,圖片大小為28×28像素,我們相求這128個圖片的均值,應該這么寫
m = np.mean(batch, axis=0)
輸出結果m的shape為(28,28),就是這128個圖片在每一個像素點平均值。
52 矩陣相關計算如何實現?
1)定義:
a = np.matrix([ [1, 2, 3, 4], [5, 5, 6, 8], [7, 9, 9, 1], [4, 6, 7, 1] ])
2)加法減法
#矩陣乘法: b = a * a #not matrix multiplication! #or c = np.dot(a, a) #matrix multiplication #or d = a np.dot(a, a, d) #matrix multiplication
53 如何初始化矩陣?
a =np.array([1,3,4,5,6]) s =np.array([[13],[4],[6]]) print( a ) print (s) print(a+s) #此處a和s可以交換
結果:
[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指數序列的產生?
>>> a = np.logspace(0,9,10,base=2)
>>> a
array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])
每一項的形態是base=2的0-9次方序列
56 numpy如何產生等比數列?
import numpy as np
np.logspace(2.0, 3.0, num=4) array([ 100. , 215.443469 , 464.15888336, 1000. ])
57 如何生成復雜矩陣?
通過形式函數是現,比如:
b = np.fromfunction(lambda x,y,z:x*100+y*10+z,(3,3,3),dtype=int)
58 如何遍歷數組?
分三個辦法:
第一種,最常用的,通過for in遍歷數組
colours = ["red","green","blue"] for colour in colours: print colour
第二種,先獲得數組的長度,然后根據索引號遍歷數組,同時輸出索引號
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?
函數原型numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
start : scalar(標量值),表明序列起始數
stop : scalar(標量值),序列終結位置, 若endpoint=True,序列包含end;若endpoint=False,序列不包含end;
num:int 序列中元素個數
endpoint : bool 如果是真,則一定包括stop,如果為False,一定不會有stop
retstep : bool 如果真,將間隔步長也返回,否則,不返回步長
dtype:數據的類型(int32,float32)
實例:
向量無論如何轉置,都是它本身;如:
s_data = np.linspace(-1,1,30)
r_data = np.transpose(s_data)
在此,s_data和r_data 兩個向量完全一樣。而
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 獲取張量的最小量對應的序號
當axis=None時,為張量展開成一維單列的序號,否則就是行向,或列向的若干序號。
a = np.array([ [7,5,6], [5,4,2], [7,3,6]]) print(np.argmin(a,axis=None))
64 將某個張量矩陣寫成二進制的位張量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 將某個張量改變形狀,但數值不變
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系列函數
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. |
67 內存和文件的映射
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