如何将不同的操作应用于矩阵的不同列?

时间:2017-02-27 14:14:38

标签: python

我有一个嵌套列表作为矩阵。对于每个列的项目,我需要应用相同的操作,但操作的一个参数取决于列,因此它是变量。并且包含在列表中。我该怎么用?

示例:

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]]

2 个答案:

答案 0 :(得分:4)

您可以使用 lambda表达式列表来执行您想要执行的操作:

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

所以这里我们将第一列乘以2,我们递增第二列,然后将第三列除以三。

现在我们可以使用以下列表推导来生成一个新矩阵:

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]

答案 1 :(得分: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]])

免责声明:我回答原始问题。我为所提供的示例提供了明智的方法,也提供了一堆典型的数值计算方案。