2017-03-21 36 views
2

雖然與numpy熟悉我自己,我注意到numpy陣列一個有趣的現象:調用拉姆達與numpy的陣列

import numpy as np 

arr = np.array([1, 2, 3]) 
scale = lambda x: x * 3 

scale(arr) # Gives array([3, 6, 9]) 

對比這與正常的Python列表:

arr = [1, 2, 3] 
scale = lambda x: x * 3 

scale(arr) # Gives [1, 2, 3, 1, 2, 3, 1, 2, 3] 

我很好奇至於如何這是可能的。 numpy數組是否會覆蓋乘法運算符或什麼?

+0

這與'lambda'無關......無論如何,'numpy'數組會覆蓋大多數運算符來執行* vectorized *操作。這是'numpy'的主要功能之一... –

+0

請參閱https://docs.scipy.org/doc/numpy-dev/user/quickstart.html#basic-operations –

回答

1

numpy.ndarrayoverloads*操作者通過定義自己的__mul__方法。對於+,-等也是如此。這允許向量算術。

0

這些是兩個不同的對象,當您對它們使用*運算符時,其行爲會有所不同。

  1. 在第一種情況您生成numpy的陣列。在這種情況下,*運算符被重載執行乘法。即每個元素將乘以3.

  2. 在第二種情況下,您將生成一個列表。在這種情況下,*操作符被視爲repetition operator,整個列表重複3次。

代碼例如:

type(np.array([1,2,3])) 
type([1, 2, 3]) 

結果:

list 
numpy.ndarray 
1

所有在numpy的約Overriding運營商

你可以學習numpy.arry here

讓我們專注於爲每個LAMDA功能;

1. numpy的陣列:

arr = numpy.array([1, 2, 3]) 
type(arr) 
scale = lambda x: x * 3 
scale(arr) 

這需要每個元素從陣列

2.正常列表:

a =[1,2,3] 
type(a) 
scale = lambda x: x * 3 
scale(a) 

這需要完整清單x和乘法這裏的名單本身