Идентификация числовых и типов массива в numpy

У меня была одна и та же проблема, потому что я переместил местоположение проекта и просто нуждался в воссоздании виртуального каталога.

16
задан David Z 1 February 2009 в 07:47
поделиться

5 ответов

Как другие ответили, могли быть другие числовые типы помимо тех, Вы упоминаете. Один подход должен был бы проверить явно на возможности, которые Вы хотите, с чем-то как

# Python 2
def is_numeric(obj):
    attrs = ['__add__', '__sub__', '__mul__', '__div__', '__pow__']
    return all(hasattr(obj, attr) for attr in attrs)

# Python 3
def is_numeric(obj):
    attrs = ['__add__', '__sub__', '__mul__', '__truediv__', '__pow__']
    return all(hasattr(obj, attr) for attr in attrs)

Это работает на все Ваши примеры кроме последнего, numpy.array(['1']). Поэтому numpy.ndarray имеет специальные методы для числовых операций, но повышает TypeError, при попытке использовать их неуместно со строкой или объектными массивами. Вы могли добавить явную проверку на это как

 ... and not (isinstance(obj, ndarray) and obj.dtype.kind in 'OSU')

, Это может быть достаточно хорошо.

, Но... Вы никогда не можете быть 100% уверены, что кто-то не определит другой тип с тем же поведением, таким образом, более надежный путь будет состоять в том, чтобы на самом деле попытаться сделать вычисление и поймать исключение, что-то как

def is_numeric_paranoid(obj):
    try:
        obj+obj, obj-obj, obj*obj, obj**obj, obj/obj
    except ZeroDivisionError:
        return True
    except Exception:
        return False
    else:
        return True

, но в зависимости от того, как часто Вы планируете назвать использование им и с тем, какие аргументы, это не может быть практично (это может быть потенциально медленно, например, с большими массивами).

18
ответ дан 30 November 2019 в 17:53
поделиться

В целом гибкое, быстро, и pythonic способ обработать неизвестные типы должны просто выполнить некоторую операцию на них и поймать исключение на недопустимых типах.

try:
    a = 5+'5'
except TypeError:
    print "Oops"

Кажется мне, что этот подход легче, чем специальное преобразование регистра некоторая функция для определения абсолютной уверенности типа.

6
ответ дан 30 November 2019 в 17:53
поделиться

Ваш is_numeric является неточным. См. мои комментарии к своему вопросу.

Другие числовые типы могли быть: long, complex, fractions.Fraction, numpy.bool_, numpy.ubyte...

operator.isNumberType() возвраты True для чисел Python и numpy.array.

Начиная с Python 2.6 можно использовать isinstance(d, numbers.Number) вместо устаревшего operator.isNumberType().

Обычно лучше проверить возможности объекта (например, можно ли добавить целое число к нему), и не его тип.

1
ответ дан 30 November 2019 в 17:53
поделиться

Также, numpy имеет numpy. Isreal и другие аналогичные функции ( Numpy.is + Tab должны перечислять их).

Все они имеют свои веселые угловые случаи, но один из них может быть полезен.

4
ответ дан 30 November 2019 в 17:53
поделиться

IsinStance (Numpy.int32 (4), номера. Внимание) Возвращает false , так что это не совсем работает. Operator.isnumbertype () , однако работает на всех вариантах Numpy Numbers, в том числе Numpy.Array ([1]) .

1
ответ дан 30 November 2019 в 17:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: