簡體   English   中英

python中矩陣的元素操作

[英]element-wise operations of matrix in python

假設我有一個像這樣的矩陣:

matrix1 = [[11,12,13,14,15,16,17],[21,22,23,24,25,26,27],[31,32,33,34,35,36,37],
            [41,42,43,44,45,46,47],[51,52,53,54,55,56,57],[61,62,63,64,65,66,67],
            [71,72,73,74,75,76,77]]

我想創建一個函數,它將接收兩個矩陣並進行逐點乘法。 (不使用numpy)

我已經看到使用拉鏈的一些東西,但這似乎並不適合我。 我認為這是因為我的列表是列表而不是單個列表。

我的代碼:

def pointwise_product(a_matrix, a_second_matrix):
    # return m[i][j] = a_matrix[i][j] x a_second_matrix[i][j]
    return [i*j for i,j in zip(a_matrix,a_second_matrix)]

Matrix1可以作為兩個參數插入。 另一個名為display_matrix的函數將接受此函數並在新行上顯示列表的每個元素,但這超出了本問題的范圍。

我的猜測是我需要一些列表推導或lambda函數,但我對python來說太新了以至於完全掌握它們。

由於您有2D列表,因此需要嵌套理解。 您可以使用以下內容:

[[i * j for i, j in zip(*row)] for row in zip(matrix1, matrix2)]

這將導致以下示例( matrix1 * matrix1 ):

[[121, 144, 169, 196, 225, 256, 289], 
 [441, 484, 529, 576, 625, 676, 729], 
 [961, 1024, 1089, 1156, 1225, 1296, 1369], 
 [1681, 1764, 1849, 1936, 2025, 2116, 2209], 
 [2601, 2704, 2809, 2916, 3025, 3136, 3249], 
 [3721, 3844, 3969, 4096, 4225, 4356, 4489], 
 [5041, 5184, 5329, 5476, 5625, 5776, 5929]]

關於什么

def pw(m1, m2):
    """
    Given two lists of lists m1 and m2 of the same size, 
    returns the point-wise multiplication of them, like matrix point-wise multiplication
    """
    m = m1[:]

    for i in range(len(m)):
        for j in range(len(m[i])):
            m[i][j] = m1[i][j]*m2[i][j]

    return m

m = [[1,2,3], [4,5,6]]
assert([[1*1, 2*2, 3*3], [4*4, 5*5, 6*6]] == pw(m,m))

是否存在過早優化的原因? 如果是,那么使用numpy。

暫無
暫無

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

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