lambda函数在numpy函数数组构造函数中

时间:2016-11-19 17:45:39

标签: python numpy

创建矩阵B的以下代码的最后一行出了什么问题?

为什么max函数的使用与前一行中的简单表达式i + j不同?

import numpy
print('Version =', numpy.version.version) # = 1.11.1
A=numpy.fromfunction(lambda i,j: i+j, (3,3), dtype=int)
B=numpy.fromfunction(lambda i,j: max(i,j),(3,3),dtype=int)

1 个答案:

答案 0 :(得分:3)

Numpy的fromfunction方法创建了两个数组,一个是每个单元格的值是该单元格的x索引,另一个是每个单元格是该单元格的y索引。然后它应用您传入的函数。

在您第一次调用该函数时,它会执行以下操作:

x=[[0 0 0]
   [1 1 1]
   [2 2 2]]
y=[[0 1 2]
   [0 1 2]
   [0 1 2]]
result = fn(x,y)

其中fn是你的lambda函数。 numpy数组的添加等同于元素添加,因此这表现得如你所料。但是,在第二个示例中,您使用max作为函数,并且未在numpy数组上定义python builtin max函数。这是因为定义python max的方式是这样的:

def max(x,y):
    if x>y:
        return x
    return y

但是,如果x和y都是numpy数组,x>y是一个numpy数组,if <numpy array>没有多大意义,这就是我们收到错误消息的原因:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

简而言之,您传递到numpy.fromfunction的函数不会在每对数字上执行,而是作为一个整体的矩阵执行,如上所述生成。 Numpy计算元素最大值的方法是numpy.maximum,因此将max替换为numpy.maximum,您的代码将按预期工作。

最后一点:lambda x,y: max(x,y)等同于max,因为两者都代表一个带有两个参数并返回其最大值的函数。所以当你重写代码的那一行时,你可以写:

B=numpy.fromfunction(numpy.maximum,(3,3),dtype=int)