NumPy:使用ndarray对函数值求和

时间:2015-07-21 14:45:32

标签: python numpy

统计学家在这里试图弄清楚NumPy如何在飞行中发挥作用。我需要使用SciPy的rv_discrete来实现一些东西,但是我遇到了错误,我已经追溯到NumPy中的以下行为。它可能是超级基础,但我很困惑。

我试图理解为什么以下简单代码

{{2} }

如果我简单地删除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里面我将一个 ndarray 对象传递给sumtest(),但我无法理解当时的情况。发生这种情况。

我之所以这样说是因为完全如何testfn()在SciPy的_cdfsingle()课程中编码,我需要知道如何这可以用来定义新的随机变量。

如果这太基础了,那么我会欣赏一个链接到某个地方开始。任何帮助将不胜感激。

编辑:根据以下评论,让我澄清一下我想要发生的事情。我基本上希望rv_discrete表现得好像它在传递给它的数组上以分量方式运行。因此,如果testfn()是传递给[1,2,3]的数组,那么在一天结束时,我希望testfn()返回数量np.sum

2 个答案:

答案 0 :(得分:1)

Numpy.sum()需要类似数组作为其第一个参数。因此,您需要testfn()来返回数组。

您似乎认为Numpy.sum()会在对每个输入进行求和之前评估testfn()。事实并非如此。如果您要将testfn()映射到m,则可能会获得您正在寻找的行为。

所以试试:

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

答案 1 :(得分: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返回一个数组,并且您可以对该数组中的值进行细粒度控制。