2015-07-21 61 views
1

統計學家在這裏試圖弄清楚NumPy如何在飛行中工作。我需要使用SciPy的rv_discrete來實現一些東西,但是我收到了錯誤,我已經回溯到NumPy中的以下行爲。這可能是超級基本的,但我很困惑。NumPy:使用ndarray總結函數值

我試圖理解爲什麼下面簡單的代碼工作:

import numpy as np 

def testfn(k): 
    if k == 1: 
     return 1 
    else: 
     return 1/k**2 

def sumtest(k): 
    m = np.arange(1,k+1) 
    print(np.sum(testfn(m),axis=0)) 

sumtest(100) 

如果我只是擺脫了條件語句的內部testfn()return 1/k**2替換它,然後一切都很好。我可以直覺,這是因爲在sumtest()我通過ndarray對象到testfn(),但我無法掌握髮生在引擎蓋下的事情。

我之所以問這個是這是正是_cdfsingle()是如何在SciPy的的rv_discrete類編碼,我需要知道它是如何工作來定義新的隨機變量。

如果這太基本了,那麼我會很感激鏈接到某個地方開始。任何幫助將不勝感激。

編輯:根據下面的評論,讓我澄清我想發生什麼。我基本上想要testfn()就好像它在傳遞給它的數組上進行分組操作一樣。因此,如果[1,2,3]是傳遞給testfn()的數組,則在一天結束時,我想要np.sum返回數量1 + 1/4 + 1/9

回答

1

Numpy.sum()需要類似數組作爲其第一個參數。因此,您需要testfn()才能返回數組。

看起來好像你認爲Numpy.sum()在對每個輸入進行求和之前將會評估testfn()。事實並非如此。如果您要通過m映射testfn(),您可能會收到您正在查找的行爲。

所以嘗試:

n = map(testfn, m) 
print(np.sum(n,axis=0)) 
+0

我想用Numpy,你必須使用'np.vectorize()'而不是'map',但這基本上是一個竅門。我會首先嚐試一下我的全尺寸範例,看看它是否有效。謝謝! – gogurt

0

編輯:

大多數numpy在逐元素陣列上的功能。您所需的功能可以通過多種方式完成。最numpythonic可能改變testfn(k)以下:

# This already works element-wise on k. 
# Numpy overrides the basic mathematical operators like +, -, *, /, ** 
# to be element-wise. Therefore `result` is an array the same length as k 
# (Remember to use 1. so float division occurs!) 
result = 1./k**2 

# result[k == 1] is equivalent to result[np.where(k == 1)] 
# for this example, only the first element of k is equal to 1 
# so the [k == 1] yields "index 0" 
# therefore result[k == 1] yields only the first element of result 
# once you've selected the appropriate elements of result, overwrite 
# the values with whatever you like 
result[k == 1] = 1 

return result 

現在,你總是會得到一個數組從testfn回來,你必須在該數組中的值進行細粒度的控制。

+0

感謝。我知道k是一個數組,所以這就是爲什麼條件語句不起作用,但我想我想知道如何使它工作。我並不是想避免零分,我只是想了解幕後的事情。 – gogurt

+0

但是,你究竟想通過條件語句'if k == 1'來測試? – wflynny

+0

啊,我明白了。我想我正在嘗試構建一個組件式的操作。因此,如果傳遞給'testfn()'的數組中的一個組件等於1(在這種情況下,它總是第一個組件),然後將其映射爲1.對於所有其他值'k'數組(即> 1),將它們映射到「1/k ** 2」。我將編輯該問題。 – gogurt