NumPy是Python語言的擴展庫,支持許多高維數組和矩陣的操作。此外,它還為數組操作提供了許多數學函數庫。機器學習涉及到對數組的大量轉換和操作,這使得NumPy成為必不可少的工具之一。
下面的100個練習都是從numpy郵件列表、stack overflow和numpy文檔中收集的。
1.以np的名稱導入numpy包(★☆☆)
import numpy as np
2.列印numpy版本和配置(★☆☆)
print(np.__version__)np.show_config()
3.創建一個大小為10的空向量(★☆☆)
Z = np.zeros(10)print(Z)
4.如何找到任何數組的內存大小(★☆☆)
Z = np.zeros((10,10))print("%d bytes" % (Z.size * Z.itemsize))
5.如何從命令行獲取numpy add函數的文檔?(★☆☆)
%run `python -c "import numpy; numpy.info(numpy.add)"`
6.創建一個大小為10的空矢量,第五個值為1(★☆☆)
Z1 = np.zeros(10)Z1[4] = 1print(Z1)
7.創建一個向量,其值的範圍是10到49(★☆☆)
Z7 = np.arange(10,50)print(Z7)
8.反轉向量(第一個元素變為最後一個)(★☆☆)
Z8 = np.arange(50)Z8 = Z8[::-1]print(Z8)
9.創建一個從0到8的3 * 3矩陣(★☆☆)
x = np.arange(0,9).reshape(3,3)
10.查找來自[1,2,0,0,4,0]的非零元素的索引(★☆☆)
nz10 = np.nonzero([1,2,0,0,4,0])print(nz10)
11.創建一個3 * 3的單位矩陣(★☆☆)
Z = np.eye(3)
12.創建一個具有隨機值的3x3x3數組(★☆☆)
Z = np.random.random((3,3,3))
13.創建一個具有隨機值的10x10數組,並找到最小值和最大值(★☆☆)
Z = np.random.random((10,10))Zmin, Zmax = Z.min(), Z.max()print(Zmin, Zmax)
14.創建一個大小為30的隨機向量,並找到平均值(★☆☆)
Z = np.random.random(30)m = Z.mean()print(m)
15.創建一個邊界為1,內部為0的二維數組(★☆☆)
Z15 = np.ones((10,10))Z15[1:-1,1:-1] = 0print(Z15)
16.如何在現有數組周圍添加邊框(用0填充)?(★☆☆)
17.以下表達式的結果是什麼?(★☆☆)
18.創建一個5x5矩陣,對角線正下方的值為(1、2、3、4)(★☆☆)
Z18 = np.diag(1+np.arange(4),k=-1)
19.創建一個8x8矩陣,並用棋盤圖案填充它(★☆☆)
Z19 = np.zeros((8,8),dtype=int)Z19[1::2,::2] = 1Z19[::2,1::2] = 1print(Z19)
20.考慮一個形狀為(6,7,8)的數組,第100個元素的索引(x,y,z)是什麼?(★☆☆)
print(np.unravel_index(99,(6,7,8)))
21.使用tile函數創建一個棋盤格8x8矩陣(★☆☆)
Z = np.tile( np.array([[0,1],[1,0]]), (4,4))
22.歸一化一個5x5隨機矩陣(★☆☆)
Z = np.random.random((5,5))Z = (Z - np.mean (Z)) / (np.std (Z))
23.創建一個自定義dtype,將顏色描述為四個unsigned bytes(RGBA)(★☆☆)
24.將5x3矩陣乘以3x2矩陣(實矩陣乘積)(★☆☆)
Z241 = np.dot(np.ones((5,3)), np.ones((3,2)))print(Z241)# Alternative solution, in Python 3.5 and aboveZ242 = np.ones((5,3)) @ np.ones((3,2))print(Z242)
25.給定一維數組,將3到8之間的所有元素乘以-1。(★☆☆)
Z = np.arange(11)Z[(3 < Z) & (Z < 8)] *= -1
26.以下腳本的輸出是什麼?(★☆☆)
27.考慮一個整數向量Z,以下哪個表達式是合法的?(★☆☆)
28.以下表達式的結果是什麼?
print(np.array(0) / np.array(0))print(np.array(0) // np.array(0))print(np.array([np.nan]).astype(int).astype(float))
29.如何round away from zero一個浮點數組(★☆☆)
Z = np.random.uniform(-10,+10,10)print (np.copysign(np.ceil(np.abs(Z)), Z))
30.如何找到兩個數組之間的公共值?(★☆☆)
Z1 = np.random.randint(0,10,10)Z2 = np.random.randint(0,10,10)print(np.intersect1d(Z1,Z2))
31.如何忽略所有numpy警告(不建議)?(★☆☆)
# Suicide mode ondefaults = np.seterr(all="ignore")Z = np.ones(1) / 0# Back to sanity_ = np.seterr(**defaults)# Equivalently with a context managernz1 = np.nonzero([1,2,0,0,4,0])print(nz1)
32.以下表達式是否正確?(★☆☆)
np.sqrt(-1) == np.emath.sqrt(-1)
33.如何獲取昨天,今天和明天的日期?(★☆☆)
34.如何獲取與2016年7月對應的所有日期?(★★☆)
Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]')
35.如何就地計算((A + B)*(-A / 2))(without copy)?(★★☆)
A = np.ones(3)*1B = np.ones(3)*2C = np.ones(3)*3np.add(A,B,out=B)np.divide(A,2,out=A)np.negative(A,out=A)np.multiply(A,B,out=A)
36.使用5種不同方法(★★☆)提取隨機數組的整數部分
Z = np.random.uniform(0,10,10)print (Z - Z%1)print (np.floor(Z))print (np.ceil(Z)-1)print (Z.astype(int))print (np.trunc(Z))
37.創建一個5x5矩陣,其行值範圍為0到4(★★☆)
Z = np.zeros((5,5))Z += np.arange(5)
38.考慮一個生成器函數,該函數生成10個整數並使用它來構建數組(★☆☆)
39.創建一個大小為10的向量,其值的範圍從0到1,0和1都排除在外(★★☆)
Z = np.linspace(0,1,11,endpoint=False)[1:]
40.創建一個大小為10的隨機向量並將其排序(★★☆)
Z = np.random.random(10)Z.sort()
41.如何求和一個比np.sum快的小數組?(★★☆)
Z = np.arange(10)np.add.reduce(Z)
42.考慮兩個隨機數組A和B,檢查它們是否相等(★★☆)
43.使數組不可變(只讀)(★★☆)
Z43 = np.zeros(10)Z43.flags.writeable = FalseZ43[0] = 1
44.考慮一個表示笛卡爾坐標的隨機10x2矩陣,將其轉換為極坐標(★★☆)
Z = np.random.random((10,2))X,Y = Z[:,0], Z[:,1]R = np.sqrt(X**2+Y**2)T = np.arctan2(Y,X)print(R)print(T)
45.創建大小為20的隨機向量,並將最大值替換為0(★★☆)
Z = np.random.random(20)Z[Z.argmax()] = 0
46.創建一個結構化數組,x和y坐標覆蓋[0,1]x[0,1]區域(★★☆)
Z46 = np.zeros((5,5), [('x',float),('y',float)])Z46['x'], Z46['y'] = np.meshgrid(np.linspace(0,1,5),np.linspace(0,1,5))print(Z46)
47.給定兩個數組X和Y,構造柯西矩陣C(Cij = 1 /(xi_yj))
X = np.arange(8)Y = X + 0.5C = 1.0 / np.subtract.outer(X, Y)print(np.linalg.det(C))
48.列印每種numpy標量類型的最小和最大可表示值(★★☆)
49.如何列印數組的所有值?(★★☆)
np.set_printoptions(threshold=np.nan)Z = np.zeros((16,16))
50.如何找到向量中最接近給定標量的值?(★★☆)
Z = np.arange(100)v = np.random.uniform(0,100)index = (np.abs(Z-v)).argmin()print(Z[index])
51.創建一個結構化的數組,表示位置(x,y)和顏色(r,g,b)(★★☆)
52.考慮一個形狀(100,2)表示坐標的隨機向量,逐點查找距離(★★☆)
53.如何將浮點數(32位)數組轉換為整數(32位)?
Z = (np.random.rand(10)*100).astype(np.float32)Y = Z.view(np.int32)Y[:] = Zprint(Y)
54.如何讀取以下文件?(★★☆)
55. numpy數組的枚舉等效於什麼?(★★☆)
56.生成通用的類似於2D的高斯數組(★★☆)
X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10))D = np.sqrt(X*X+Y*Y)sigma, mu = 1.0, 0.0G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) )print(G)
57.如何在2D數組中隨機放置p個元素?(★★☆)
n = 10p = 3Z57 = np.zeros((n,n))np.put(Z57, np.random.choice(range(n*n), p, replace=False),1)print(Z57)
58.減去矩陣的每一行的均值(★★☆)
59.如何按第n列對數組排序?(★★☆)
Z59 = np.random.randint(0,10,(3,3))print(Z59)print(Z59[Z59[:,1].argsort()])
60.如何判斷給定的2D數組是否有空列?(★★☆)
Z = np.random.randint(0,3,(3,10))print((~Z.any(axis=0)).any())
61.從數組中的給定值中找到最接近的值(★★☆)
Z = np.random.uniform(0,1,10)z = 0.5m61 = Z.flat[np.abs(Z - z).argmin()]print(m61)
62.考慮兩個形狀為(1,3)和(3,1)的數組,如何使用迭代器計算它們的總和?(★★☆)
A = np.arange(3).reshape(3,1)B = np.arange(3).reshape(1,3)it = np.nditer([A,B,None])for x,y,z in it: z[...] = x + yprint(it.operands[2])
63.創建一個具有name屬性的數組類(★★☆)
64.對於給定的向量,如何為第二個向量索引的每個元素添加1(注意重複索引)?(★★★)
65.如何基於索引列表(I)將向量(X)的元素累積到數組(F)中?(★★★)
X = [1,2,3,4,5,6]I = [1,3,9,3,4,1]F = np.bincount(I,X)print(F)
66.考慮一個(dtype = ubyte)的(w,h,3)圖像,計算唯一顏色的數量(★★★)
w,h = 16,16I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)F = I[...,0]*256*256 + I[...,1]*256 +I[...,2]n = len(np.unique(F))print(np.unique(I))
67.考慮一個四維數組,如何一次獲得最後兩個軸的和?(★★★)
68.考慮一維向量D,如何使用描述子集指標的相同大小的向量S來計算D子集的均值?(★★★)
69.如何獲得點積的對角線?(★★★)
A = np.random.uniform(0,1,(5,5))B = np.random.uniform(0,1,(5,5))# Slow version np.diag(np.dot(A, B))# Fast versionnp.sum(A * B.T, axis=1)# Faster versionnp.einsum("ij,ji->i", A, B)
70.考慮向量[1、2、3、4、5],如何構建一個在每個值之間有3個連續零的新向量?(★★★)
Z = np.array([1,2,3,4,5])nz = 3Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz))Z0[::nz+1] = Zprint(Z0)
71.考慮一個維度為(5,5,3)的數組,如何將它與維度為(5,5)的數組相乘以?(★★★)
A = np.ones((5,5,3))B = 2*np.ones((5,5))print(A * B[:,:,None])
72.如何交換數組的兩行?(★★★)
A = np.arange(25).reshape(5,5)A[[0,1]] = A[[1,0]]print(A)
73.考慮一組描述10個三角形(具有共享頂點)的10個三元組,找到組成所有三角形的唯一線段集(★★★)
faces = np.random.randint(0,100,(10,3))F = np.roll(faces.repeat(2,axis=1),-1,axis=1)F = F.reshape(len(F)*3,2)F = np.sort(F,axis=1)G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] )G = np.unique(G)
74.給定一個數組C,為bincount,如何生成一個數組n使得np.bincount(A)== C?(★★★)
C = np.bincount([1,1,2,3,4,4,6])A74 = np.repeat(np.arange(len(C)), C)print(A74)
75.如何使用數組上的滑動窗口計算平均值?(★★★)
76.考慮一維數組Z,構建一個二維數組,其第一行是(Z [0],Z [1],Z [2]),隨後的每一行都移位1(最後一行應為( Z [-3],Z [-2],Z [-1])(★★★)
77.如何取反布爾值,或如何改變浮點符號?(★★★)
Z = np.random.randint(0,2,100)np.logical_not(Z, out=Z)Z = np.random.uniform(-1.0,1.0,100)np.negative(Z, out=Z)
78.考慮描述線(2d)的2組點(P0、P1)和點P,如何計算從p到每條線i的距離(P0 [i],P1 [i])?(★★★)
79.考慮描述線(2d)的2組點(P0、P1)和一組點P,如何計算從每個點j(P [j])到每個線i(P0 [i],P1 [i]的距離) )?(★★★)
# based on distance function from previous questionP0 = np.random.uniform(-10, 10, (10,2))P1 = np.random.uniform(-10,10,(10,2))p = np.random.uniform(-10, 10, (10,2))print(np.array([distance(P0,P1,p_i) for p_i in p]))
80.考慮一個任意的數組,編寫一個函數來提取形狀固定的子部分並以給定元素為中心(必要時使用fill值填充)(★★★)
81.考慮數組Z = [1,2,3,4,5,6,7,8,9,10,11,12,13,14],如何生成數組R = [[1,2, 3,4],[2,3,4,5],[3,4,5,6],…,[11,12,13,14]]?(★★★)
Z = np.arange(1,15,dtype=np.uint32)R = stride_tricks.as_strided(Z,(11,4),(4,4))
82.計算矩陣秩(★★★)
Z = np.random.uniform(0,1,(10,10))U, S, V = np.linalg.svd(Z) # Singular Value Decompositionrank = np.sum(S > 1e-10)print(rank)
83.如何在數組中查找最頻繁的值?
Z = np.random.randint(0,10,50)print(np.bincount(Z).argmax())
84.從隨機的10x10矩陣(★★★)中提取所有連續的3x3 blocks
85.創建一個2D數組子類,使得Z [i,j] == Z [j,i](★★★)
86.考慮一組形狀為(n,n)的p個矩陣和一組形狀為(n,1)的p個向量。如何一次計算p個矩陣乘積的總和?(結果的形狀為(n,1))(★★★)
87.考慮一個16x16的數組,如何獲得塊總和(塊大小為4x4)?(★★★)
88.如何使用numpy數組實現「生命遊戲」?(★★★)
89.如何獲取數組的n個最大值(★★★)
Z = np.arange(10000)np.random.shuffle(Z)n = 5# Slowprint (Z[np.argsort(Z)[-n:]])# Fastprint (Z[np.argpartition(-Z,n)[:n]])
90.給定任意數量的向量,構建笛卡爾積(每一項的每一個組合)(★★★)
91.如何從常規數組創建記錄數組?(★★★)
92.考慮一個大向量Z,用3種不同的方法計算Z的3次方(★★★)
x = np.random.rand(int(5e7))%timeit np.power(x,3)%timeit x*x*x%timeit np.einsum('i,i,i->i',x,x,x)
93.考慮兩個形狀為(8,3)和(2,2)的數組A和B。如何找到A的行包含B的每一行的元素,而不考慮B中元素的順序?(★★★)
A = np.random.randint(0,5,(8,3))B = np.random.randint(0,5,(2,2))C = (A[..., np.newaxis, np.newaxis] == B)rows = np.where(C.any((3,1)).all(1))[0]print(rows)
94.考慮一個10x3矩陣,提取不等值的行(例如[2,2,3])(★★★)
95.將整數向量轉換為矩陣二進位表示形式(★★★)
96.給定二維數組,如何提取unique行?(★★★)
97.考慮兩個向量A和B,寫出inner、outer、sum和mul函數的einsum等價(★★★)
98.考慮由兩個向量(X,Y)描述的路徑,如何使用等距樣本進行採樣(★★★)
99.給定一個整數n和一個二維數組X,從X中選擇可以解釋為n次多項式分布的行,即僅包含整數且總和為n的行。(★★★)
100.計算一維數組X的平均值的自舉95%置信區間(即,對數組中的元素重新取樣N次,計算每個樣本的平均值,然後計算平均值的百分比)。(★★★)
謝謝閱讀!!:)