Numpy: .max() et .min() ne fonctionnent pas sur les tableaux de type 'S' et 'U' (Trac #1316)

Créé le 19 oct. 2012  ·  4Commentaires  ·  Source: numpy/numpy

_Billet original http://projects.scipy.org/numpy/ticket/1316 le 2009-12-07 par @mdboom , attribué à unknown._

C'est une opération sensée. Ce serait bien de le faire fonctionner si possible.

In [25]: x.max()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/wonkabar/data1/builds/betadrizzle/<ipython console> in <module>()

TypeError: cannot perform reduce with flexible type

In [26]: x.min()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/wonkabar/data1/builds/betadrizzle/<ipython console> in <module>()

TypeError: cannot perform reduce with flexible type

In [27]:
00 - Bug Other

Tous les 4 commentaires

Cela devrait être faisable. Notez que argmax et argmin fonctionnent et peuvent fournir un moyen simple de l'implémenter sans utiliser maximum.reduce .

.max peut prendre un tuple d'axes, argmax ne peut gérer qu'un seul axis , donc pour que cela fonctionne pour le cas général, il faudra beaucoup de brassage d'axes , et éventuellement en copiant pour fusionner ces axes. keepdims et out sont aussi dans la signature de max mais pas de argmax . Quels types seraient impliqués? « S », « U » et « V » ?

Est-ce le même problème que celui décrit au nr.

In [1]: np.array([['dd', 'de', 'cc'], ['ae', 'be', 'hf']]).max(axis=0)
TypeError: cannot perform reduce with flexible type

À la question de @jondo (il y a près de 4 ans à ce stade mais mérite d'être abordée), oui.

La plainte du Dr Feldman est mieux exprimée par un exemple. Il dit "Parce que les méthodes .min() et .max() de NumPy fonctionnent pour les tableaux numériques, et que les fonctions min() et max() de Python fonctionnent pour les chaînes, on peut raisonnablement s'attendre à ce que les méthodes .min() et .max() de NumPy fonctionnent pour des tableaux de chaînes, mais ils ne[...]"

Voici une illustration :

import numpy as np

arr_str = np.array(["I'm", "Defying", "Gravity"]) #A wickedly simple array of strings

print(arr_str.max()) #raises "TypeError: cannot perform reduce with flexible type"
#Interestingly, when I just used a native Python list, the error for this line was: "AttributeError: 'list' object has no attribute 'max'"

print(max(arr_str)) #does not raise any kind of error and returns "I'm" no matter where it is in the array of strings above

#This code works as expected
arr_num = np.array([1,2,3,-1])
print(max(arr_num))

Le problème du Dr Feldman, comme il l'a déclaré, concerne les tableaux de chaînes et souhaite utiliser .max() plutôt que max(); mais nous pouvons l'étendre à une préoccupation concernant n'importe quel type flexible. Notez qu'il ne mentionne pas que max() fonctionne très bien lorsque nous passons le tableau en paramètre, mais comme vous pouvez le voir dans l'exemple ci-dessus, cela fonctionne.

J'ai vérifié ce que @charris a dit, que .argmax() fonctionne.

Ma question pour la communauté serait la suivante : est-ce suffisamment un problème (devoir utiliser max(list) ou list.argmax) pour que cela vaille la peine de plonger dans les problèmes d'axe soulevés par

Cette page vous a été utile?
0 / 5 - 0 notes