J'utilise la façon suivante pour mettre à l'échelle un tableau à n dimensions entre 0 et 1:

x_scaled = (x-np.amin(x))/(np.amax(x)-np.amin(x))

Mais c'est très lent pour les grands ensembles de données. J'ai des milliers de baies relativement grandes que je dois traiter. Existe-t-il une méthode plus rapide pour cela en python?

Edit: Mes tableaux sont en forme (24,24,24,9). Pour le scaler MinMax dans scikit, le tableau d'entrée doit avoir une certaine forme que la mienne n'a pas, donc je ne peux pas l'utiliser. Dans la documentation, il est écrit:

Parameters: 
X : array-like, shape [n_samples, n_features]
0
Wise 12 avril 2018 à 18:09

4 réponses

Meilleure réponse

La réponse de MadPhysicist peut être optimisée pour éviter une allocation inutile de données temporaires:

x -= x.min()
x /= x.ptp()

Les opérateurs inplace (+=, -=, etc ...) ne mangent pas votre mémoire (donc l'échange sur disque est moins susceptible de se produire). Bien sûr, cela détruit votre x initial, donc c'est OK si vous n'avez pas besoin de x par la suite ...

En outre, l'idée qu'il a proposée de concaténer des données multiples dans des matrices de dimension supérieure, est une bonne idée si vous avez beaucoup de canaux, mais encore une fois, il convient de tester si cette GRANDE matrice génère ou non l'échange de disques, par rapport aux petites matrices traitées en séquence.

1
sciroccorics 12 avril 2018 à 15:36

Il est risqué d'utiliser ptp , c'est-à-dire max - min, car il peut en théorie être égal à 0, ce qui conduit à une exception. Il est plus sûr d'utiliser minmax_scale comme il n'a pas ce problème. Tout d'abord, pip install scikit-learn.

from sklearn.preprocessing import minmax_scale

minmax_scale(array)

Si vous utilisez un pipeline Sklearn, utilisez plutôt MinMaxScaler.

2
Acumenus 15 oct. 2018 à 13:56

L'accélération la plus simple de votre code serait de ne pas calculer { {X0}} deux fois. Cela en soi devrait aider d'environ 30%:

mn, mx = x.min(), x.max()
x_scaled = (x - mn) / (mx - mn)

Vous pourriez également être en mesure d'obtenir un certain kilométrage de { {X0}}:

mn, ptp = x.min(), x.ptp()
x_scaled = (x - mn) / ptp

D'ailleurs, quelle est la taille de votre baie qui min ou max fonctionne réellement lentement?

0
Mad Physicist 12 avril 2018 à 15:15

Eh bien, je pensais que vous pouvez toujours utiliser MinMaxScaler de sklearn. Il vous suffit de remodeler vos données en quelque chose comme [n_samples, n_features], de les mettre à l'échelle, puis de les remodeler à leur forme d'origine. Cela n'a pas vraiment d'importance tant que vous le remodelez correctement. En termes de vitesse, je ne pense pas que ce sera vraiment différent de le faire avec numpy, cela vous évite simplement les tracas de la multiplication et de la division.

0
Wise 18 juil. 2019 à 03:04