Statisticien ici essayant de comprendre comment NumPy fonctionne à la volée. J'ai besoin d'implémenter quelque chose en utilisant SciPy rv_discrete, mais j'obtiens des erreurs dont j'ai retracé le comportement suivant dans NumPy. C'est probablement super basique, mais je suis sérieusement confus.

J'essaie de comprendre pourquoi le code simple suivant ne fonctionne pas :

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)

Si je me débarrasse simplement de l'instruction conditionnelle à l'intérieur de testfn() et la remplace par return 1/k**2, alors tout va bien. Je peux comprendre que c'est parce qu'à l'intérieur de sumtest() je passe un objet ndarray à testfn(), mais je n'arrive pas à comprendre ce qui se passe sous le capot lorsque ça arrive.

La raison pour laquelle je pose cette question est que c'est exactement comment _cdfsingle() est codé dans la classe rv_discrete de SciPy, et j'ai besoin de savoir comment cela fonctionne pour définir de nouvelles variables aléatoires.

Si c'est trop basique, j'apprécierais un lien vers un endroit pour commencer. Toute aide serait grandement appréciée.

MODIFIER: Conformément au commentaire ci-dessous, permettez-moi de clarifier ce que je veux qu'il se passe. Je veux essentiellement que testfn() agisse comme s'il opérait par composant sur le tableau qui lui est passé. Donc, si [1,2,3] est le tableau passé à testfn(), alors à la fin de la journée je veux que np.sum renvoie la quantité 1 + 1/4 + 1/9.

1
gogurt 21 juil. 2015 à 17:45

2 réponses

Meilleure réponse

Numpy.sum() nécessite un tableau comme son premier argument. En tant que tel, vous aurez besoin de testfn() pour renvoyer un tableau.

Il semble que vous pensez que Numpy.sum() évaluera testfn() sur chaque entrée avant de la additionner. Ce n'est pas le cas. Si vous deviez mapper testfn() sur m, vous pourriez obtenir le comportement que vous recherchez.

Alors essayez:

n = map(testfn, m)
print(np.sum(n,axis=0))
1
dshapiro 21 juil. 2015 à 14:55

Éditer:

La plupart numpy fonctionnent par élément sur les tableaux. La fonctionnalité souhaitée peut être réalisée de plusieurs manières. Le plus numpythonique est probablement de changer testfn(k) comme suit:

# 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

Désormais, vous obtiendrez toujours un tableau renvoyé par testfn, et vous aurez un contrôle précis sur les valeurs de ce tableau.

0
wflynny 21 juil. 2015 à 17:32