2013-06-24 46 views
0

我最近開始使用NumPy(到目前爲止它非常有用 - 爲什麼我不能儘早開始使用它),但仍然有一些我確信我是做錯了:NumPy矢量化函數

  • 如何將函數應用於矢量(ndarray)?我希望它是矢量化的,它是一個比乘法更復雜的函數。我試過使用np.where,但這似乎是一個醜陋的解決方案(我不確定它的向量化)。有沒有一個類似於map的函數,這樣我的函數將被矢量化?

  • 假設我有一個二維數組 - 只是一個二維位置向量的數組,並且假設我想要找到每個向量的範數,並且如果它超過了某個值,請做任何事情。 np.where似乎是一個很好的解決方案,但它不會工作,除非我轉置陣列:np.where(sum(a.T**2) > 10, a * 2, 0)(只是一個任意的例子)。這看起來很冗長,而且轉置沒有多大意義。最後,如果我有一個三維數組 - 一個2維位置向量的二維數組(這樣在位置[1,2]將是向量(1,2))。我如何迭代所有的矢量(使用矢量化函數,如np.where)?我一直在使用np.reshape,但如果可能的話,我想保持陣列的形狀相同。

我要將這些問題一起,因爲他們似乎相似,但如果我需要把它們分割成單獨的線程,請讓我知道,我會這麼做。

+0

雖然有*是*的方式做你所描述的事情,你可能會檢查出['pandas'](http://pandas.pydata.org/),它可以處理許多這些操作。 –

+0

你的第一個問題是什麼意思?顯然,你可以將多個算術和其他算子連接在一起來構建一個更大的函數。否則,如果你想要矢量化你的函數,你需要放入C或者Fortran(或者Cython),因爲numpy沒有辦法繞過每個元素的函數調用。 –

+0

但是,我不能說,例如,從每個元素創建一個新的numpy數組總和呢? (只是一個例子,我不會只是總結它)。 – James

回答

0

像上面的評論,我不太清楚你在問什麼。但對於第一個問題,請參考此示例:

假設您有一個2d向量的numpy數組,並且您想計算每個向量的範數。你能不能做這樣的事情:

import numpy as np 

x = np.arange(20).reshape(10,2) 
norm_func = lambda z: sum(z**2) 
norm_func(x.T) 

這將使結果

array([ 1, 5, 9, 13, 17, 21, 25, 29, 33, 37]) 

爲陣

array([[ 0, 1], 
     [ 2, 3], 
     [ 4, 5], 
     [ 6, 7], 
     [ 8, 9], 
     [10, 11], 
     [12, 13], 
     [14, 15], 
     [16, 17], 
     [18, 19]])