Numpy: .max () и .min () не работают с массивами типа 'S' и 'U' (Trac # 1316)

Созданный на 19 окт. 2012  ·  4Комментарии  ·  Источник: numpy/numpy

_Оригинальный билет http://projects.scipy.org/numpy/ticket/1316 от 07.12.2009 , unknown._

Это разумная операция. Было бы неплохо, чтобы это работало, если это возможно.

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

Все 4 Комментарий

Это должно быть выполнимо. Обратите внимание, что argmax и argmin работают и могут предоставить простой способ реализовать это без использования maximum.reduce .

.max может принимать кортеж осей, argmax может обрабатывать только один axis , поэтому, чтобы заставить его работать в общем случае, потребуется много перетасовки осей , и, возможно, копирование для объединения этих осей. keepdims и out также входят в сигнатуру max но не argmax . Какие типы будут задействованы? «S», «U» и «V»?

Это та же проблема, что описана в

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

На вопрос @jondo (на данный момент почти 4 года назад, но стоит ответить), да.

Жалобу доктора Фельдмана лучше всего выразить на примере. Он говорит: «Поскольку методы NumPy .min () и .max () работают с числовыми массивами, а функции Python min () и max () работают со строками, можно разумно ожидать, что методы NumPy .min () и .max () будут работают с массивами строк, но не [...] "

Вот иллюстрация:

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

Проблема доктора Фельдмана, как он заявил, связана с массивами строк и желанием использовать .max (), а не max (); но мы можем расширить его до беспокойства о любом гибком типе. Обратите внимание, что он не упоминает, что max () отлично работает, когда мы передаем массив в качестве параметра, но, как вы можете видеть из приведенного выше примера, он действительно работает.

Я проверил, что сказал @charris , что .argmax () действительно работает.

Мой вопрос к сообществу: достаточно ли этой проблемы (необходимость использования max (list) или list.argmax), что стоит погрузиться в проблемы оси, которые поднял @jaimefrio ?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги