2016-11-19 62 views
4

创建矩阵B的以下代码的最后一行有什么问题?numpy的函数数组构造函数中的lambda函数

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

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) 

回答

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函数。这是因为蟒蛇最大的定义方式是这样的:

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,因此用numpy.maximum替换max,您的代码将按预期工作。

最后一个注释:lambda x,y: max(x,y)相当于max,因为两者都表示一个函数,它接受两个参数并返回其最大值。所以,当你重写该行代码,你可以写:

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

感谢您的回答克里斯托弗 – user7182979

+0

是我的荣幸!如果这里的答案解决了您的问题,请将它标记为已接受,如果您不介意:) –