2017-02-27 64 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

相关问题