Python- np.random.choice

Python- np.random.choice

我正在使用 numpy.random.choice 模块根据函数数组生成 'array' 个选项:

def f(x):
    return np.sin(x)

def g(x):
    return np.cos(x)


base=[f, g]

funcs=np.random.choice(base,size=2)

此代码将生成一个 'array' 的 2 项引用基本数组中的函数。

这个 post 的原因是,我已经打印了 funcs 的结果并收到:

[<function f at 0x00000225AC94F0D0> <function f at 0x00000225AC94F0D0>]

很明显,return是对某种形式的函数的引用,并不是我理解那种形式是什么或如何操作它,这就是问题所在。我想改变选择函数,因此它不再是随机的,而是取决于某些条件,所以它可能是:

for i in range(2):
    if testvar=='true':
        choice[i] = 0 
    if testvar== 'false':
        choice[i] = 1

这将 return 一组索引放在后面的函数中

问题是,代码的进一步操作(我认为)需要这种先前形式的函数引用:[ ] 作为输入,而不是简单的 0,1 Indicies 数组,我不知道如何我可以通过使用 if 语句得到一个形式为 [ ] 的数组。

对于需要此输入的其余代码,我可能完全错了,但我不知道如何修改它,因此我 post 在这里输入它。完整代码如下:(@Attack68 在 上提供的代码略有变化)它旨在存储一个函数,该函数在每次迭代时与随机函数相乘并相应地进行积分。 (我已经对导致问题的函数上方的代码发表了评论)

import numpy as np
import scipy.integrate as int

def f(x):
    return np.sin(x)

def g(x):
    return np.cos(x)

base = [f, g]

funcs = np.random.choice(base, size=2)
print(funcs)
#The below function is where I believe the [<function...>] input to be required
def apply(x, funcs):
    y = 1
    for func in funcs:
        y *= func(x)
    return y

print('function value at 1.5 ', apply(1.5, funcs))

answer = int.quad(apply, 1, 2, args=(funcs,))
print('integration over [1,2]: ', answer)

这是我尝试实现一个非随机事件:

import numpy as np
import scipy.integrate as int
import random
def f(x):
    return np.sin(x)

def g(x):
    return np.cos(x)

base = [f, g]

funcs = list()
for i in range(2):
    testvar=random.randint(0,100) #In my actual code, this would not be random but dependent on some other situation I have not accounted for here
    if testvar>50:
        func_idx = 0 # choose a np.random operation: 0=f, 1=g
    else:
        func_idx= 1
    funcs.append(func_idx)
#funcs = np.random.choice(base, size=10)
print(funcs)
def apply(x, funcs):
    y = 1
    for func in funcs:
        y *= func(x)
    return y

print('function value at 1.5 ', apply(1.5, funcs))

answer = int.quad(apply, 1, 2, args=(funcs,))
print('integration over [1,2]: ', answer)

这 return 是以下错误:

TypeError: 'int' object is not callable

如果您仍想按原样使用函数 apply,则需要在输入中保留一个函数列表。您可以使用这些索引来创建函数列表,而不是提供索引列表。

而不是 apply(1.5, funcs),尝试:

apply(1.5, [base(n) for n in funcs])

如果:您正在尝试将对随机选择的函数列表进行操作的原始代码重构为使用与函数列表中的项目相对应的随机索引进行操作的版本。重构 apply.

def apply(x,indices,base=base):
    y = 1
    for i in indices:
        f = base[i]
        y *= f(x)
    return y

...this returns a reference to the functions in some form, not that I understand what that form is or how to manipulate it...

函数是对象,列表包含对对象本身的引用。可以通过将它们分配给名称然后调用它们或索引列表并调用对象来使用它们:

>>> def f():
...     return 'f'

>>> def g():
...     return 'g'

>>> a = [f,g]
>>> q = a[0]
>>> q()
'f'
>>> a[1]()
'g'
>>> for thing in a:
    print(thing())

f
g

或者你可以传递它们:

>>> def h(thing):
...     return thing()

>>> h(a[1])
'g'
>>>