redimensionner avec la moyenne ou de la rebin un numpy tableau 2d
Je suis en train de ré-écrire en python un IDL fonction:
http://star.pst.qub.ac.uk/idl/REBIN.html
qui est en train de réduire par un facteur entier d'un tableau 2d en moyenne.
Par exemple:
>>> a=np.arange(24).reshape((4,6))
>>> a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
Je voudrais redimensionner à (2,3) en prenant la moyenne des échantillons pertinents, le résultat attendu serait:
>>> b = rebin(a, (2, 3))
>>> b
array([[ 3.5, 5.5, 7.5],
[ 15.5, 17.5, 19.5]])
c'est à dire b[0,0] = np.mean(a[:2,:2]), b[0,1] = np.mean(a[:2,2:4])
et ainsi de suite.
Je crois que je dois remodeler à 4 dimensions, tableau, puis prendre la moyenne sur la bonne tranche, mais ne pouvait pas comprendre l'algorithme. Auriez-vous une astuce?
- viens de la trouver maintenant, c'est un double de la stackoverflow.com/questions/4624112/..., cependant je ne pouvais pas savoir avant d'utiliser la fonction de recherche dans stackoverflow.
Vous devez vous connecter pour publier un commentaire.
Voici un exemple basé sur la réponse que vous avez lié (pour plus de clarté):
En fonction:
numpy-discussion
pour l'ajouter ànumpy
mais la réponse a été négative.J. F. Sebastian a une grande réponse pour la 2D binning. Voici une version de son "rebin" fonction qui fonctionne pour N dimensions:
Ici un moyen de faire ce que vous demandez en utilisant la matrice de multiplication qui ne nécessite pas les nouvelles dimensions du tableau de diviser le vieux.
Nous avons d'abord générer une ligne compresseur de la matrice et d'une colonne compresseur de la matrice (je suis sûr qu'il ya une façon plus propre de faire cela, peut-être même utiliser numpy exploitation):
... ainsi, par exemple,
get_row_compressor(5, 3)
vous donne:et
get_column_compressor(3, 2)
vous donne:Alors simplement prémultiplier par la ligne compresseur et postmultiply par la colonne compresseur pour obtenir la compression de la matrice:
À l'aide de cette technique,
rendements:
J'ai essayé de convertir un raster-prendre environ 6000 par 2000 format raster et de le transformer en arbitrairement une taille plus petite raster que la moyenne des valeurs correctement à travers le précédent bacs de tailles. J'ai trouvé une solution en utilisant SciPy, mais alors je ne pouvais pas obtenir SciPy à installer sur le service d'hébergement mutualisé, j'ai été à l'aide, alors j'ai écrit cette fonction à la place. Il est probable que l'une de meilleures façons de faire ce qui n'implique pas de boucle à travers les lignes et les colonnes, mais cela ne semble pas fonctionner.
La belle partie de ceci est que l'ancien nombre de lignes et de colonnes n'ont pas à être divisible par le nouveau nombre de lignes et de colonnes.