2017-02-27 33 views
3

我有一個嵌套列表作爲矩陣。對於每個列的項目,我需要應用相同的操作,但其中一個操作的參數取決於列,因此它是可變的,並且包含在列表中。我應該使用什麼?如何將不同的操作應用於矩陣的不同列?

例子:

arg_list = [1,2,3] 

matrix = [[1,2,3], 
      [1,3,5], 
      [6,7,2], 
      [1,4,2]] 

減法的結果:

matrix = [[0,0,0], 
      [0,1,2], 
      [5,5,-1], 
      [0,2,-1]] 

回答

4

可以使用拉姆達的列表表達式您要進行類似的操作:

operations = [lambda x:x*2,lambda x:x+1,lambda x:x//3] 

所以這裏我們將第一列乘以兩,我們公司回顧第二欄,我們將第三欄分爲三欄。

現在我們可以使用下面的列表中理解,產生一個新的矩陣:

new_matrix = [[f(x) for f,x in zip(operations,row)] for row in matrix] 

說你的矩陣是:

matrix = [[1,2,3], 
      [1,3,5], 
      [6,7,2], 
      [1,4,2]] 

那麼new_matrix是:

>>> [[f(x) for f,x in zip(operations,row)] for row in matrix] 
[[2, 3, 1], [2, 4, 1], [12, 8, 0], [2, 5, 0]] 

或更多句法:

new_matrix = [[2, 3, 1], 
       [2, 4, 1], 
       [12, 8, 0], 
       [2, 5, 0]] 

如果你有但一個泛型函數

def f(column,x): 
    # ... column is the index (starting by 0) 
    return column+x # an example 

您可以使用枚舉:

new_matrix = [[f(col,x) for col,x in enumerate(row)] for row in matrix] 

在你的情況,你可以這樣寫:

def f(column,x): 
    return x-arg_list[column] 
+0

@ Giperboloid:該問題在答案的第二部分中得到了強調,其中使用了給定列索引的泛型「f」。 –

+0

太棒了,但是我應該如何迭代x作爲該表達式中的映射元素? – Giperboloid

+0

你是什麼意思的地圖元素? 'x'是矩陣中的一個元素。 –

1

您添加的示例要麼極具誤導性,要麼說明XY problem

對於這種特定情況,您確實在做矢量化或行操作(不確定其規範正確的名稱)。最可讀的和有效的方式,根據數值計算場景中,是使用的numpy模塊和利用它:

import numpy as np 

arg_list = np.array([1,2,3]) 

matrix = np.array([[1,2,3], 
        [1,3,5], 
        [6,7,2], 
        [1,4,2]]) 

result = matrix - arg_list 

結果是預期的矩陣:

array([[ 0, 0, 0], 
     [ 0, 1, 2], 
     [ 5, 5, -1], 
     [ 0, 2, -1]]) 

聲明:我am 不是回答原來的問題。我爲所提供的示例提供了明智的方法,並提供了一些典型的數值計算場景。

+0

我知道numpy的存在,但是這次我被要求自己製作解決方案。 – Giperboloid

+0

然後我不同意這個具體的教學過程。但這超出了SO的範圍。 – MariusSiuram

相關問題