统计学家在这里试图弄清楚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
。
答案 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
返回一个数组,并且您可以对该数组中的值进行细粒度控制。