0
votes

Utiliser NUMPY avec des lancers rapides "Impossible d'invoquer" * "avec un argument"

Je prévois d'utiliser les numéros de Python à Swift, car je dois utiliser Swift pour des calculs mathématiques. Le code SWIFT est -

error: <Cell 3>:2:17: error: cannot call value of non-function type 'PythonObject'
let x = np.zeros(shape:(1, 2))
        ~~~~~~~~^

error: <Cell 3>:2:12: error: cannot invoke 'zeros' with an argument list of type '(shape: (Int, Int))'
let x = np.zeros(shape:(1, 2))
           ^


4 commentaires

Désolé mais c'est un code swift non python :) Veuillez lire la question. :)


J'ai trouvé cet exemple simple d'utilisation numpy: Gist.github.com/anurlybayev/... Autorise np.zeros (forme = (1,2)) , mais il doit y avoir quelque chose à propos de la syntaxe Swift qui empêche une telle traduction.


@HPaulj Lien de gist brisé.


Vous le trouvez vous-même. Je viens de rechercher sur Swift and Numpy. Rien d'extraordinaire.


4 Réponses :


1
votes

Pourrait-il être que vous n'appelez pas correctement les zéros?

Si ce que vous êtes après est une matrice 2x2, vous voudrez peut-être jeter un coup d'œil aux docs pour NUMPY Comme il semble que vous appelle faussement ladite méthode

EDIT: Ma suggestion n'était pas correcte, mais il semble toujours que l'erreur réside dans la syntaxe, jetez un coup d'œil à Ce

Edit2: selon votre commentaire, voici quelques explications. ( TLDR en bas)
Edit3: Ma conclusion ci-dessous semble avoir tort pour la solution voir la réponse de @MarkroXor ci-dessous. Cependant, la différence entre () et [] tient, donc je quitterai le paragraphe tel quel.

Je ne suis pas trop familier avec Swift, donc je ne peux donc pas vous assurer que tout ce que je dis est correct, mais voilà. Je viens de supposer que les arguments sont passés à Python dans la façon dont ils sont mis dans l'appel de la méthode. Maintenant, dans Python X = [A, B, C] créera un objet de liste de types tandis que x = (a, b, c) créera un tuple. Ils sont tous deux utilisés pour stocker plusieurs éléments accessibles via X [Index]. La différence la plus importante entre eux étant, qu'une liste peut être modifiée après sa création ( x [0] = z ) tout en essayant ceci sur un tuple lancera une erreur. Cependant, cela ne s'applique pas à Swift (contrairement à ce que je pensais au début)

Maintenant, voyant comment Python ignore considérablement les types de paramètres tant que rien de "illégal" est tenté avec eux, je pensais qu'il était probable que numpy.zeros () ne se soucierait pas s'il est passé liste ou un tuple tant qu'il contient des entiers (testés, aucune erreur). Encore une fois, cela s'applique à l'utilisation dans Python lui-même uniquement

Maintenant, après avoir levé la syntaxe Swift Syntaxe, je dirais que le problème / la solution est que pendant que Swift et Python semblent gérer des listes / des tableaux (Python les appelle les listes) de la même manière, la syntaxe des tuples diffère grandement, ce qui entraîne la méthode de lancer Une erreur lors de l'utilisation d'accolades rondes, créant ainsi un tuple Swift que Python ne sait pas comment manipuler, alors que la similitude de la manière dont les tableaux / listes fonctionnent conduit à [] être transmis avec succès à la méthode NUMPY < BR>
TLDR la différence semble être que, tandis que pendant que les matrices de python et de swift sont de la même manière, la mise en œuvre de tuples diffère, de sorte que ce serait la raison en utilisant [] fonctionne sur ()


4 commentaires

Veuillez lire la question, ce n'est pas un code Python c'est Swift. :)


Merci, comme débutant, je n'ai pas remarqué la différence entre les accolades rondes et carrées à Swift.


Souvent, Python traite des listes et des tuples interchangeables. Parfois, numpy utilise la différence pour fournir une fonctionnalité ajoutée. Mais dans np.zeros fonctionne. Le mot clé est également facultatif.


@HPaulj Merci beaucoup pour la clarification! Donc, il semble que mon idée originale soit (au moins partiellement) juste après tout. Je ne pouvais pas le vérifier rapidement car je n'ai pas d'environnement rapide installé rn



0
votes

L'erreur vous indique que tout ce que vous essayez d'appeler n'est pas une fonction.

Essayez d'utiliser .Call (avec :) code> à la place: P>

let x = np.zeros.call(with: 15).shape.call(with: 1, 2)


5 commentaires

Cela échoue avec - Erreur fatale: Impossible d'accéder au membre PythonObject 'Call': Fichier /swift/swift/swift/stdlib/Public/python/python.swift, ligne 537


`` `importer python laissez np = python.import (" numpy ") let x = npl.zeros.call (avec: 15) .Pashape.call (avec: 1, 2)` `` `` `


Appliquez la nouvelle ligne selon les besoins ^^. Je ne peux pas l'utiliser dans des commentaires.


D'accord, essayez juste let x = npl.zeros.call (forme: (1, 2))


Veuillez exécuter le code dans votre environnement avant de le suggérer. Cela ne fonctionne pas non plus. Quoi qu'il en soit, merci. S'il vous plaît vérifier la réponse de @nightmared et ses commentaires.



0
votes

Lorsque le corps de la fermeture a une erreur dedans, le compilateur signalera que celui-ci ne peut pas appeler la valeur d'un type non-fonction 'pythonObject' . En corrigeant l'erreur de la fermeture, elle compilera.

dans numpy.zeros forme est un paramètre qui est un int ou < fort> tuple d'intens , vous devez donc simplement modifier votre code en: xxx

aussi si vous avez besoin d'un "tableau de tableaux", vous pouvez utiliser le Après la syntaxe: xxx

ceci crée une matrice de 1 x 2 de zéros.


0 commentaires

0
votes

La syntaxe correcte est - xxx

[Notez les supports]. xxx

rendements xxx < / Pré>

Swift est rigide avec la syntaxe Contrairement à Python, où les accolades rondes et carrées pourraient être utilisées de manière interchangeable lorsque vous passez à une fonction la plupart du temps. np.zeros ou np.some_function prend tableau comme argument d'entrée. D'où le besoin de crochets.


0 commentaires