首頁>技術>

通常,資料科學家被要求在Python中執行簡單的矩陣運算,這應該很簡單,但許多人會偏離正軌。

本文將介紹面試中經常出現的4個Numpy/matrix問題,並用Python編寫程式碼。

問題1:

給定4x4 Numpy矩陣,如何反轉矩陣?

# 步驟0:構造一個4*4 Numpy矩陣
import numpy as npmatrix = np.arange(1,17).reshape(4,4)print(matrix)
[[ 1  2  3  4] [ 5  6  7  8] [ 9 10 11 12] [13 14 15 16]]

旁註,np.arange(1,17) 返回一個Numpy陣列,並*reshape(4,4)生成一個44矩陣。

# 步驟1:展平numpy陣列
matrix_flat = matrix.flatten()matrix_flat
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16])

有兩種方法可以根據資料型別展平矩陣。對於Numpy陣列,我們使用np.array.flatten() ;對於非陣列矩陣,我們用matrix.ravel(). 請試一試。

# 步驟2:將元素讀入一個新的矩陣
matrix_reversed = matrix_flat[::-1]matrix_reversed
array([16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1])

展平後,我們從最後一個元素開始向後讀取矩陣。

# 步驟3: 將矩陣重塑為4*4矩陣
matrix_reversed.reshape(4,4)

最後,我們重塑矩陣並將其轉換回4*4矩陣,如下所示:

array([[16, 15, 14, 13],       [12, 11, 10,  9],       [ 8,  7,  6,  5],       [ 4,  3,  2,  1]])

Numpy陣列或矩陣的獨特屬性是,必須在反轉它之前將其展平,並且有兩種方法取決於資料格式(是否為Numpy)。

問題2:

兩個矩陣如何相乘?

這類問題可能很棘手!

兩個矩陣?是不是numpy?

解決方案在很大程度上取決於它所引用的資料型別。總的來說,有兩種解決方案:用於Numpy陣列的dot方法和用於非陣列的迴圈方法。

解決方案1:Numpy陣列
# 步驟1: Numpy陣列
A = np.arange(9).reshape(3,3)B = np.arange(10,19).reshape(3,3)AB
# Aarray([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])       # Barray([[10, 11, 12],       [13, 14, 15],       [16, 17, 18]])       # 步驟2: dot 方法 
result = A.dot(B)print(result)
[[ 45  48  51] [162 174 186] [279 300 321]]

dot方法很容易解決Numpy陣列的乘法問題,但我懷疑面試問題不會這麼容易。

所以,對非陣列做乘法題的可能性更大。

解決方案2:非陣列
# 步驟0:構造兩個矩陣。
X = [    [1,2,3],    [2,3,4,],    [4,3,2]]Y = [    [2,3,4],    [3,4,6],    [2,3,5]]

Python沒有matrix的內建資料型別,我們使用列表的列表(巢狀列表)。

# 步驟1:建立一個零矩陣來儲存結果
Z = [    [0,0,0],    [0,0,0],    [0,0,0]]

建立空矩陣的原因是將乘法結果儲存在下面的巢狀for迴圈中。

# 步驟2:巢狀for迴圈
# 在X的行上迭代; len(X)返回行數for i in range(len(X)):         # 在Y的列上迭代; len(Y[0])返回列數    for j in range(len(Y[0])):                # 迭代Y的行        for k in range(len(Y)):                        Z[i][j] += X[i][k]*Y[k][j]        Z
[[14, 20, 31], [21, 30, 46], [21, 30, 44]]

讓我們解開巢狀for迴圈:

for i in range(len(X)):返回行數;for j in range(len(Y[0])):返回Y的列數。旁註:我們使用Y[0]訪問矩陣列,使用Y訪問矩陣行;for k in range(len(Y)):迭代Y的行;Z[i][j]+=X[i][k]*Y[k][j]:按元素乘法的和填充Z中的值。

回想一下,兩個矩陣的序列相乘:X的第一行中的元素與Y的第一列中的元素相乘再相加。重複這個過程直到結束。

上面的巢狀迴圈簡單地遵循與我們通常所做的相同的計算矩陣乘法的過程。

問題3:

如何轉置矩陣?

同樣,有多種解決方案取決於是否允許你使用Numpy。

解決方案1:巢狀for迴圈(不要使用Numpy)
# 步驟0:建立矩陣
X = [    [12,7],    [1,2],    [3,4]]# 步驟1:空列表transpose = [    [0,0,0],    [0,0,0]]
#步驟2:巢狀for迴圈
# 行上迭代for i in range(len(X)):        # 列上迭代: # len(transpose) = len(X[0])    for j in range(len(transpose)):                 # 替換        transpose[j][i] = X[i][j]        for r in transpose:     print(r)
[12, 1, 3][7, 2, 4]
解決方案2:對元組列表使用zip(不要使用Numpy)
# 步驟1:建立元組列表
matrix = [(1,2,3),(4,5,6),(7,8,9),(10,11,12)]# 元組列表matrix
[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]

我們使用一個元組列表來建立一個矩陣。

#第二步:解壓和壓縮成一行
# 透過*解壓# 透過zip壓縮matrix_transpose = zip(*matrix)for i in matrix_transpose:    print(i)
(1, 4, 7, 10)(2, 5, 8, 11)(3, 6, 9, 12)
解決方案3:使用Numpy陣列3.1 np.transpose()
X = [    [12,7],    [1,2],    [3,4]]# 3.1 np.transpose()import numpy as nptranspose = np.transpose(X)print(transpose)

如果我們能使用Numpy,一行就可以完成任務。

3.2 np.array.T
matrix_array = np.array(X)matrix_array.T
array([[12,  1,  3],       [ 7,  2,  4]])

或者,我們可以將矩陣(list)更改為Numpy陣列並使用array.T。

問題4:

如何將兩個Numpy矩陣相加?

同樣,有兩種解決方案取決於我們是否可以使用Numpy。

解決方案1:np.array()
X = [[12,7,3],    [4 ,5,6],    [7 ,8,9]]Y = [[5,8,1],    [6,7,3],    [4,5,9]]    import numpy as np X_np = np.array(X)Y_np = np.array(Y)result = X_np + Y_npprint(result)
[[17 15 4][10 12 9][11 13 18]]

Numpy可以輕鬆地處理元素新增。

解決方案2:普通矩陣的巢狀for迴圈
result = np.zeros((3,3))# 行的迭代for i in range(len(X)):    # 列的迭代    for j in range(len(X[0])):        result[i][j] = X[i][j]+Y[i][j]        for r in result:     print(r)
[17. 15.  4.][10. 12.  9.][11. 13. 18.]

程式碼是不言而喻的,我們已經在上面的問題中涵蓋了它們。

另一方面,這個問題有兩種不同的說法。

4.1如何垂直堆疊矩陣?
X = [[12,7,3],    [4 ,5,6],    [7 ,8,9]]Y = [[5,8,1],    [6,7,3],    [4,5,9]]np.vstack((X,Y))
array([[12,  7,  3],       [ 4,  5,  6],       [ 7,  8,  9],       [ 5,  8,  1],       [ 6,  7,  3],       [ 4,  5,  9]])
4.2如何水平堆疊矩陣?
# 水平堆疊X = [[12,7,3],    [4 ,5,6],    [7 ,8,9]]Y = [[5,8,1],    [6,7,3],    [4,5,9]]np.hstack((X,Y))
array([[12,  7,  3,  5,  8,  1],       [ 4,  5,  6,  6,  7,  3],       [ 7,  8,  9,  4,  5,  9]])

請參閱Github以獲取完整的Python程式碼:https://github.com/LeihuaYe/Matrix_in_Python

備註在面試過程中保持良好的溝通。詢問澄清問題和限制條件。例如: 能用Numpy陣列嗎?在試圖反轉矩陣之前先將其展平。巢狀for迴圈很有用。試著理解每一行是如何工作的。

7
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 「小雨學程式設計之C#」 程式說明