Python NumPy:使用ndarray对函数值求和

Python NumPy:使用ndarray对函数值求和,python,numpy,Python,Numpy,这里的统计学家试图弄清楚NumPy是如何在飞行中工作的。我需要使用SciPy的rv_discrete实现一些东西,但是我得到了一些错误,这些错误可以追溯到NumPy中的以下行为。这可能是超基本的,但我很困惑 我试图理解为什么下面的简单代码不起作用: 将numpy导入为np def测试fn(k): 如果k==1: 返回1 其他: 返回1/k**2 def sumtest(k): m=np.arange(1,k+1) 打印(np.总和(测试Fn(m),轴=0)) sumtest(100) 如果我简

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

我试图理解为什么下面的简单代码不起作用:

将numpy导入为np
def测试fn(k):
如果k==1:
返回1
其他:
返回1/k**2
def sumtest(k):
m=np.arange(1,k+1)
打印(np.总和(测试Fn(m),轴=0))
sumtest(100)
如果我简单地去掉
testfn()中的条件语句,并将其替换为
return1/k**2
,那么一切都很好。我可以直觉地认为这是因为在
sumtest()
中,我正在将一个ndarray对象传递给
testfn()
,但我无法理解发生这种情况时引擎盖下发生了什么

我问这个问题的原因是,这正是SciPy的
rv_discrete
类中
\u cdfsingle()
的编码方式,我需要知道如何定义新的随机变量

如果这是太基本,那么我希望有一个链接到某个地方开始。任何帮助都将不胜感激

编辑:根据下面的评论,让我澄清我希望发生的事情。我基本上希望
testfn()
的行为就像它在传递给它的数组上以组件方式运行一样。因此,如果
[1,2,3]
是传递给
testfn()
的数组,那么在一天结束时,我希望
np.sum
返回数量
1+1/4+1/9
编辑:

大多数
numpy
在数组上按元素运行。您想要的功能可以通过几种方式实现。最重要的功能可能是将
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
返回的数组,并且您可以对该数组中的值进行细粒度控制。

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

似乎您认为
Numpy.sum()
将在对每个输入求和之前对其求值
testfn()
。事实并非如此。如果要将
testfn()
映射到
m
,则可能会得到所需的行为

因此,请尝试:

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

谢谢我知道k是一个数组,所以这就是为什么条件语句不起作用的原因,但是我想知道如何使它起作用。我并不是想避免被零除,我只是想了解幕后的情况!但是如果k==1,你到底想用条件语句
测试什么呢?啊,我明白了。我想我正在尝试构建一个组件操作。因此,如果传递给
testfn()
的数组的一个组件等于1(我猜在本例中,它始终是第一个组件),那么将其映射到1。对于数组中的所有其他值
k
(即>1),将这些值映射到
1/k**2
。我会编辑这个问题。既然
1/(1^2)==1
,你为什么需要做这个检查?这一切都要回到
rv_discrete
的工作原理。事实上,我正在处理一个复杂的pmf,它需要这种我无法分析的控制。我刚刚提出了这个简化的示例,以避免陷入记法的泥潭。我想使用Numpy时,您必须使用
np.vectorize()
而不是
map
,但这基本上就做到了。我将首先在我的全面示例中尝试它,看看它是否有效。谢谢