【问题标题】:NumPy: summing over function values using ndarrayNumPy:使用 ndarray 对函数值求和
【发布时间】:2015-07-21 14:45:31
【问题描述】:

这里的统计学家试图弄清楚 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(),但是当这种情况发生时,我无法掌握引擎盖下发生的事情。

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

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

编辑:根据下面的评论,让我澄清一下我想要发生的事情。我基本上希望testfn() 表现得好像它在传递给它的数组上按组件操作。因此,如果[1,2,3] 是传递给testfn() 的数组,那么最终我希望np.sum 返回数量1 + 1/4 + 1/9

【问题讨论】:

    标签: python numpy


    【解决方案1】:

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

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

    那就试试吧:

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

    【讨论】:

    • 我猜对于 Numpy,您必须使用 np.vectorize() 而不是 map,但这基本上可以解决问题。我将首先在我的全尺寸示例上进行尝试,看看它是否有效。谢谢!
    【解决方案2】:

    编辑:

    大多数 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 返回一个数组,并且您可以细粒度地控制该数组中的值。

    【讨论】:

    • 谢谢。我知道 k 是一个数组,所以这就是条件语句不起作用的原因,但我想我想知道如何 make 它起作用。而且我并不是要避免被零除,我只是想了解幕后的工作原理!
    • 但是您到底想通过条件语句if k == 1 测试什么?
    • 啊,我明白了。我想我正在尝试构建一个组件式操作。因此,如果传递给 testfn() 的数组的一个组件等于 1(我猜在这种情况下它始终是第一个组件),则将其映射到 1。对于数组内的所有其他值 k(即>1),将它们映射到1/k**2。我将编辑问题。
    • 既然1/(1^2) == 1,为什么需要做这个检查?
    • 这一切都可以追溯到rv_discrete 的工作原理。实际上,我正在处理一个复杂的 pmf,它需要这种我无法通过分析来解决的控制。我只是想出了这个简化的例子,以避免陷入符号的困境。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2018-10-10
    • 1970-01-01
    • 2015-05-08
    • 2013-11-24
    • 2021-10-15
    • 2018-10-31
    • 2018-12-24
    相关资源
    最近更新 更多