簡體   English   中英

如何在 python 中進行矩陣的轉置?

[英]How can i do the transpose of a matrix in python?

我在 python 中制作一個 function ,其中當采用矩陣 A 時,它返回一個交換行和列的矩陣 B,例如:

如果我輸入這個矩陣:

1  2  3  4 
5  6  7  8
9  10 11 12
13 14 15 16

應該返回

1 5 9  13
2 6 10 14
3 7 11 15
4 8 12 16

但我得到的是:

array([[ 1,  5,  9, 13],
       [ 5,  6, 10, 14],
       [ 9, 10, 11, 15],
       [13, 14, 15, 16]])

我不明白為什么,有人可以幫我理解這個錯誤,我該如何解決?

我的代碼:

def transpose(matrix):

    for i in range(matrix.shape[0]):
        for j in range(matrix.shape[1]):
            matrix[i][j] = matrix[j][i]
            
    return matrix

(我不能使用像轉置這樣的默認函數,我必須編碼)

這條線

matrix[i][j] = matrix[j][i]

是你的問題。

例如,當i = 1j = 2時,您將matrix[1][2]設置為 10,因為matrix[2][1]是 10。當您下次遇到i = 2j = 1時,您將matrix[2][1]設置為 10,因為matrix[1][2]設置為 10,它不會保留先前值的 memory。

根據您是否希望 function 改變原始矩陣或返回具有更改值的新矩陣(但保留原始矩陣)將改變您創建此 function 的方式。

改變原來的

def transpose(matrix):
    matrix2 = numpy.copy(matrix)
    for i in range(matrix.shape[0]):
        for j in range(matrix.shape[1]):
            matrix[i][j] = matrix2[j][i]
            
    return matrix

返回一個新數組

def transpose(matrix):
    matrix2 = numpy.copy(matrix)
    for i in range(matrix.shape[0]):
        for j in range(matrix.shape[1]):
            matrix2[i][j] = matrix[j][i]
            
    return matrix2

zip可以為您做到這一點。 解壓列表並將子列表作為 arguments 傳遞給zip

lst = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14, 15, 16],
]

transposed = list(zip(*lst))
for i in transposed:
    print(i)

output:

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

您可以使用numpy.transpose轉置矩陣。

至於為什么您的代碼不起作用是因為您的程序在循環中執行以下分配:

matrix[0][2] = matrix[2][0] # writes 9
...
matrix[2][0] = matrix[0][2] # writes 9 instead of 3 because matrix[0][2] has previously been updated

因此,要解決此問題,您可以在此示例中使用output_matrix類的中間變量:

def transpose(matrix):
    output_matrix = np.zeros_like(matrix)
    for i in range(matrix.shape[0]):
        for j in range(matrix.shape[1]):
            output_matrix[i][j] = matrix[j][i]
            
    return output_matrix

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM