J'ai un tableau numpy comme celui-ci et je souhaite créer un tableau qui ressemble à ceci: p> Ainsi, Chaque ligne correspond à Une implémentation simple pourrait ressembler à ceci: p> Ma question est de savoir s'il existe une façon plus intelligente de faire cela qui évite la boucle. P> P> ar code> qui est décalée par l'index de la ligne + 1. p>
3 Réponses :
Voici une approche dans votre cas, nous construisons puis aplatir puis aplatiré Il, la coupe, remodelez-le pour obtenir et enfin, découpez la poubelle Dernières colonnes P> P> tampon code> pour être p>
roulé code>: p>
Voici une approche en utilisant échantillons d'échantillons - P> test d'exécution - p> Fabriquer une copie (si vous souhaitez apporter des modifications et non seulement utiliser comme tableau unique) gagné 't nous fait trop mal pour les Progrès numpy code >
essentiellement rembourrage avec les éléments de restover, puis les code> code> nous aidant à créer une version décalée assez efficace - progrès code> méthode - p>
Cela utilise moins de mémoire que ma solution, mais la sortie n'est pas écrite en toute sécurité. Je doute que c'est une question cependant, en faisant cette meilleure solution
@ Scientifique: qu'entendez-vous par "pas en toute sécurité écrite"?
@Cleb: Je veux dire que si vous essayez de changer l'un des 4 code> s dans le tableau, tous changeront à la fois!
@ERIC: OK, la création d'une copie devrait alors éviter ce problème, je suppose?
@Cleb Yup, devrait être bien alors.
Merci pour les timings!
Il s'avère que les documents numpus en ligne n'incluent pas réellement la documentation de as_strided code> - j'ai soumis Un patch pour permettre la construction de cette page
@Eric Yup, la partie de la documentation nécessite un travail sûr. Nous utilisons ces documents scipes pour cela jusqu'à présent. Merci pour la soumission!
@Divakar: Pouvez-vous ajouter scipy.linalg.circirculant code> à votre référence?
@ Certièrement sûr! Ajoutée.
Je soupçonne as_strided code> est laissé quelque peu caché car il s'agit d'une fonction "dangereuse". Une erreur dans les arguments peut conduire à l'interprète Python Crashing (Segfault, violations d'accès à la mémoire et tout cela).
Bonjour Divakar, Soins de Revenit Votre PR à Scipy ?
@Percusse ah oui! Eu ça à l'esprit. Continuez à perdre cependant. Je reviendrais bientôt, espérons-le en quelques jours. Merci pour le rappel!
@Divakar: Heureux de voir que cela a été incorporé maintenant, merci pour vos efforts!
Les deux réponses existantes vont bien; Cette réponse n'est probablement que d'intérêt que si vous utilisez déjà Scipy.
La matrice que vous décrivez est connue sous le nom de matrice circulante . Si cela ne vous dérange pas de la dépendance sur Scipy, vous pouvez utiliser scipy.linalg.circirculant code>
pour créer un: p>
J'utilise Scipy, de sorte que la réponse est très utile, car elle est aussi la plus lisible (upvoted). En termes de vitesse, il semble moins efficace, mais bien qu'il y a déjà un intégré à celui-ci!
On dirait que Scipey vaut un patch d'utiliser la mise en œuvre plus rapide de @ Divakar. Vous pouvez voir la mise en œuvre scipe ici < / a>
@ Arérique bonne idée! Scipey pourrait utiliser des tours de progrès à coup sûr!
Une fonction avec une meilleure performance serait géniale. Je ne suis pas sûr de renvoyer un tableau avec des progrès funky. Ce serait un changement incompatible à l'envers - nous n'avons aucune idée de la manière dont les gens utilisent le résultat de circulant code>. Quoi qu'il en soit, des discussions supplémentaires devraient être terminées dans une question sciée sur GitHub, ou dans la liste de diffusion SciPy-Dev.
@Warrenweckesser: retourner funky_strides.copy () code> est toujours une vitesse de 10x sur cette petite donnée et serait invisible à l'utilisateur
"... serait invisible à l'utilisateur" i> oui, jusqu'à ce qu'ils commencent à modifier la matrice en place. Ensuite, au moins pour l'utilisateur sans méfiance, le plaisir commence.
Essayer de forcer la question à nouveau comme j'adorerais voir SciPy Utiliser certains avantage code>. Pourriez-vous expliquer sur la partie "Fun Début"? Comme @ eric a souligné avec une copie, cela devrait être correct car la sortie aurait son propre espace mémoire séparé de la matrice d'entrée. J'espère que je ne manque pas quelque chose ici.
Et je voulais dire si nous faisons la copie dans la fonction circulant code>. Je devine que je devrais être correct alors.
Hmmm ... Si une copie avec des progrès "réguliers" est retournée, je ne me souviens pas de ce que j'étais inquiet. Et s'il y a encore un grand gain de performance, cela ressemble à un changement intéressant.
@Warrenweckesser génial! Alors, comment devrais-je continuer dessus? Devrais-je enregistrer un problème sur github.com/scipy/scipy/issues code> avec des balises:
Amélioration code>, etc., etc. Liaison à cela, donc poster? On dirait que vous êtes un contributeur sur Scipy, il serait donc agréable d'obtenir des conseils.
@Divakar: créer un nouveau problème avec une description de l'amélioration serait un bon départ. Créer une demande de traction que implémente i> l'amélioration serait encore meilleure! Voir Github.com/scipy/scipy/scipy/blob/master/hacking.rst .txt pour des informations sur la contribution à Scipy.