Python- np.random.choice

我正在使用numpy.random.choice模块基于函数数组生成选择的“数组”:

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

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


base=[f,g]

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

这段代码将产生一个由2个项目组成的“数组”,引用基本数组中的一个函数。

这篇文章的原因是,我打印了funcs的结果并收到了:

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

很显然,这以某种形式返回了对函数的引用,而不是我理解该形式是什么或如何操纵它,这就是问题所在。我想更改函数的选择,以便不再是随机的,而是取决于某些条件,所以可能是:

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

这将返回一组要放在后面的函数中的索引

问题是,代码的进一步操作(我认为)需要使用函数引用的前一种形式:[]作为输入,而不是简单的0,1指标数组,我不知道该怎么做使用if语句获取形式为[]的数组。

对于需要此输入的其余代码,我可能完全错了,但是我不知道如何修改它,因此将其发布在这里。完整的代码如下:(它是@ Evolving functions in python上@ 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,answer)

这将返回以下错误:

TypeError: 'int' object is not callable
wyd379299458 回答:Python- np.random.choice

如果您仍想按原样使用函数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

  

...这将以某种形式返回对函数的引用,而不是我不了解该形式是什么或如何使用它...

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

>>> 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'
>>>
本文链接:https://www.f2er.com/2871094.html

大家都在问