NumPy:使用ndarray对函数值求和

2024-09-28 21:56:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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(),但当这种情况发生时,我无法理解引擎盖下发生了什么。你知道吗

我问这个问题的原因是,这就是在SciPy的rv_discrete类中_cdfsingle()是如何编码的,我需要知道如何定义新的随机变量。你知道吗

如果这是太基本,那么我会很感激一个链接到某个地方开始。任何帮助都将不胜感激。你知道吗

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


Tags: 代码importnumpyreturndef错误npscipy
2条回答

Numpy.sum()需要像这样的数组作为其第一个参数。因此,您需要testfn()返回一个数组。你知道吗

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

所以试试看:

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

编辑:

大多数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返回的数组,并且您可以对该数组中的值进行细粒度控制。你知道吗

相关问题 更多 >