python - 在python中结合max、xrange和lambda函数的使用

标签 python lambda max xrange matrix-decomposition

我找到了一个为 LU 分解旋转方阵的代码,但我无法理解其中的一些代码。

def pivotize(m):
    """Creates the pivoting matrix for m."""
    n = len(m)
    ID = [[float(i == j) for i in xrange(n)] for j in xrange(n)]
    for j in xrange(n):
        row = max(xrange(j, n), key=lambda i: abs(m[i][j]))
        if j != row:
            ID[j], ID[row] = ID[row], ID[j]
    return ID

首先,ID 行不就是单位矩阵吗?这样做有什么好处吗?

其次,我不能真正理解line for row。我知道 lambda 用于在文本中定义一个函数,一旦提供了 i 的值(j 的值取决于 for 循环),它只是返回 M_ij 的值,但 i 是什么?

而且 xrange 不是类似于 range 吗?但是它在这里返回什么?

当与函数 max 结合时,会发生什么?我只是不知道正在比较的 max 函数内部的东西是什么。

如果这个问题听起来很愚蠢,我很抱歉。我对编程很陌生

最佳答案

First, isn't the line for ID simply the identity matrix?

是的。

Second, I can't really understand the line for row....

See this有关 max/key/lambda 交互的讨论。要回答“i 是什么?”,它是 lambda 函数的参数,i 可以等效为 x for foo。 (为清楚起见,分别生成 abs(m[x][j])abs(m[foo][j]))。

And isn't xrange similar to range?

是的。在 Python 2 中,xrange 返回一个序列对象,它仅在需要时才延迟计算下一个值。 See this for more info .当完全循环时,rangexrange 将产生相同的结果,但实现不同。

But what does it return here?

第 5 行的 xrange(n) 将返回从 0 到 (n-1) 的整数值,而第 6 行的 xrange(j, n) 将返回整数值从 j 到 (n-1)。

编辑

关于 lambda 的更多信息:

考虑如何将给定的数字序列加倍。首先定义一个将数字 x 加倍并返回该值的函数。然后将该函数映射到序列的每个元素。

# Traditional
def double(x): return x*2
print map(double, [1,2,3,4])         # [2, 4, 6, 8]

您也可以使用匿名 (lambda) 函数来做同样的事情:

# Lambda
print map(lambda i: i*2, [1,2,3,4])  # [2, 4, 6, 8]

请注意,一切都是一样的,除了 double 函数的定义消失了,并且在调用 map 时对该函数的引用被替换为“内联"lambda 函数。

编辑 2

And when combined with the function max, what happens?

这一行 row = max(xrange(j, n), key=lambda i: abs(m[i][j])) 可以分解如下:

  • xrange(j,n) 生成从 j(含)到 n(不含)的整数序列。
  • 然后,这些整数中的每一个都作为参数“传递”给函数的关键参数。换句话说,它们都用作 lambda 函数中的 i。 lambda 函数“返回”第 i 行和第 j 列的绝对值。[1]
  • max 函数然后找到这些“lambda 输出”的最大值并将 row 设置为等于它。

这也可以写成列表理解的最大值:

row = max( [abs(m[i][j]) for i in xrange(j,n)] )

或作为 Dan D.在他的评论中指出,写成一个生成器表达式(没有创建中间列表)简单:

row = max( abs(m[i][j]) for i in xrange(j,n) )

注意事项:

[1] 这里有一些假设,但行列是表示矩阵的标准方式。

关于python - 在python中结合max、xrange和lambda函数的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28867463/

相关文章:

MySQL MAX 返回不正确的结果

c++ - 在本地定义的结构中模拟非本地(或自由)变量

lambda - Java 8 Stream 每 100 行读取一次文件

python:替代匿名函数

javascript - 从包含 Div 和脚本标记的 html 编码字符串中动态添加 div 元素

mysql - "create function"使用 "max"时出现语法错误

dictionary - 从 kotlin map 中查找所有最大条目?

python - 推断 dtypes 时 Pandas 会改变值

Python3 Http Web 服务器 : virtual hosts

python - einsum 和距离计算