Numpy: .max () e .min () não funcionam em matrizes do tipo 'S' e 'U' (Trac # 1316)

Criado em 19 out. 2012  ·  4Comentários  ·  Fonte: numpy/numpy

_Tíquete original http://projects.scipy.org/numpy/ticket/1316 em 07-12-2009 por

Esta é uma operação sensata. Seria bom fazer funcionar, se possível.

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

Todos 4 comentários

Isso deve ser factível. Observe que argmax e argmin funcionam e podem fornecer uma maneira fácil de implementar isso sem usar maximum.reduce .

.max pode pegar uma tupla de eixos, argmax só pode lidar com um único axis , portanto, para fazê-lo funcionar no caso geral, será necessário embaralhar muito os eixos , e possivelmente copiando para unir esses eixos. keepdims e out também estão na assinatura de max mas não de argmax . Que tipos estariam envolvidos? 'S', 'U' e 'V'?

Este é o mesmo problema descrito no nr.

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

À pergunta de @jondo (quase 4 anos atrás, mas vale a pena ser respondida), sim.

A reclamação do Dr. Feldman é melhor expressa com um exemplo. Ele diz: "Como os métodos .min () e .max () do NumPy funcionam para matrizes numéricas, e as funções min () e max () do Python funcionam para strings, pode-se esperar que os métodos .min () e .max () do NumPy funcionem funcionam para matrizes de strings, mas não [...] "

Aqui está uma ilustração:

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))

O problema do Dr. Feldman, conforme ele afirmou, é sobre matrizes de strings e o desejo de usar .max () em vez de max (); mas podemos expandi-lo para uma preocupação sobre qualquer tipo flexível. Observe que ele não menciona que max () funciona bem quando passamos o array como um parâmetro, mas como você pode ver no exemplo acima, ele funciona.

Eu verifiquei o que @charris disse, que .argmax () funciona.

Minha pergunta para a comunidade seria: isso é um problema suficiente (ter que usar max (list) ou list.argmax) para que valha a pena mergulhar nas questões dos eixos que @jaimefrio trouxe à tona?

Esta página foi útil?
0 / 5 - 0 avaliações