Je dois créer une fonction qui prend une lambda, une forme de dimension et la DTYPE numpy, et produit un tableau.
Je sais theres le fromfunction code> qui fera exactement cela, mais je ne peux pas l'utiliser. Je suppose qu'une façon de regarder c'est que j'ai besoin de codé un codage un
fromfunction code>. Le problème que je vais avoir est que la fonction Lambda ne peut pas être transmise comme une fonction. J'ai essayé d'utiliser des boucles et d'utiliser des indices et je suis nouveau dans cette dernière idée, donc je ne le ferais peut-être pas correctement. Fondamentalement, j'ai besoin de créer la fonction. Les intrants sont donnés comme le résultat (attendu) dans le commentaire.
import numpy as np
def array_function(f, d, dtype=None):
return x
print(array_function(lambda i,j: (i - j)**2, [4, 4]))
# Expected Result
#[[0. 1. 4. 9.]
# [1. 0. 1. 4.]
# [4. 1. 0. 1.]
# [9. 4. 1. 0.]]
3 Réponses :
La fonction Lambda ne peut pas être transmise p>
Une fonction Lambda est une fonction, qui est un objet de première classe dans Python. Ce n'est pas un problème pour le transmettre comme un argument à une autre fonction. Vous pouvez simplement créer un look ou une compréhension sur les deux dimensions et la fabrication et la matrice, puis remodeler: p>
xxx pré> résultat: p>
xxx pré> < P> C'est un peu plus délicieux si vous voulez array_function code> pour prendre des tableaux de taille arbitraire. Une option serait de créer la matrice de la taille, puis d'énumérer sur tous les éléments pour appeler la fonction: p>
xxx pré>
Edition basée sur commentaire strong> < / p> Vous pouvez créer un itérateur avec
starmap code> et
produit code> de itTools. Je ne suis pas sûr qu'un itérateur vous achète beaucoup avec NUMPY puisque vous voulez généralement connaître la taille de la matrice lors de la création. Vous pouvez la transmettre une longueur, ce qui n'est pas nécessaire mais améliore les performances: p>
xxx pré> blockquote>
C'était éducatif. Vous pensez aussi que nous pouvons faire la même chose en utilisant itertools?
Hmm. Je ne sais pas ce que Itertools vous achète vraiment ici, mais bien sûr, vous pouvez le faire. Voir la modification.
Que diriez-vous de créer un sortie: p> np.ufunc code> à partir de votre
lambda code> et à l'aide de
Réduire code> pour l'appliquer sur plusieurs dimensions?
pour ce lambda code>,
fromfunction code> fonctionne bien:
fromfunction code> génère une "grille" de Indices de la forme: P>
In [9]: f = np.frompyfunc(foo, 2,1)
In [10]: f(np.arange(4)[:,None], np.arange(4))
Out[10]:
array([[0, 1, 4, 9],
[1, 0, 1, 4],
[4, 1, 0, 1],
[9, 4, 1, 0]], dtype=object)