2016-11-19 60 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

是我的榮幸!如果這裏的答案解決了您的問題,請將它標記爲已接受,如果您不介意:) –