문제

Numpy에는 값이 숫자 유형이거나 멍청한 배열인지 알려주는 기존 기능이 있습니까? 여러 가지 다른 표현에서 숫자를 처리 해야하는 데이터 처리 코드를 작성하고 있습니다 ( "숫자"에 따라 표준 산술 연산자, +, -, *, /, /, *를 사용하여 조작 할 수있는 숫자 수량의 표현을 의미합니다. *).

내가 찾고있는 행동의 몇 가지 예

>>> is_numeric(5)
True
>>> is_numeric(123.345)
True
>>> is_numeric('123.345')
False
>>> is_numeric(decimal.Decimal('123.345'))
True
>>> is_numeric(True)
False
>>> is_numeric([1, 2, 3])
False
>>> is_numeric([1, '2', 3])
False
>>> a = numpy.array([1, 2.3, 4.5, 6.7, 8.9])
>>> is_numeric(a)
True
>>> is_numeric(a[0])
True
>>> is_numeric(a[1])
True
>>> is_numeric(numpy.array([numpy.array([1]), numpy.array([2])])
True
>>> is_numeric(numpy.array(['1'])
False

그러한 기능이 존재하지 않으면 글을 쓰는 것이 어렵지 않아야한다는 것을 알고 있습니다.

isinstance(n, (int, float, decimal.Decimal, numpy.number, numpy.ndarray))

그러나 목록에 포함해야 할 다른 숫자 유형이 있습니까?

도움이 되었습니까?

해결책

다른 사람들이 대답했듯이, 언급 한 것 외에 다른 숫자 유형이있을 수 있습니다. 한 가지 방법은 원하는 기능을 명시 적으로 확인하는 것입니다.

# 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

그러나 사용을 얼마나 자주 사용할 계획과 인수를 가지고 있는지에 따라, 이것은 실용적이지 않을 수 있습니다 (예 : 큰 배열로는 잠재적으로 느릴 수 있습니다).

다른 팁

일반적으로 알려지지 않은 유형을 처리하는 유연하고 빠르며 피해자 방식은 일부 작업을 수행하고 유효하지 않은 유형에 대한 예외를 포착하는 것입니다.

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

이 접근법은 절대 유형의 확실성을 결정하기 위해 일부 기능을 특수 케이스하는 것보다 쉽다는 것 같습니다.

또한 Numpy가 있습니다 numpy.isreal 그리고 다른 유사한 기능 (numpy.is + 탭이 나열되어야합니다).

그들은 모두 재미있는 코너 케이스를 가지고 있지만 그중 하나는 유용 할 수 있습니다.

당신의 is_numeric 잘못 정의되어 있습니다. 귀하의 질문에 대한 내 의견을 참조하십시오.

다른 수치 유형은 다음과 같습니다. long, complex, fractions.Fraction, numpy.bool_, numpy.ubyte, ...

operator.isNumberType() 보고 True 파이썬 번호 및 numpy.array.

Python 2.6이므로 사용할 수 있습니다 isinstance(d, numbers.Number) 감가 상각되는 대신 operator.isNumberType().

일반적으로 객체의 기능 (예 : 정수를 추가 할 수 있는지 여부)의 기능을 확인하는 것이 좋습니다.

isinstance(numpy.int32(4), numbers.Number) 보고 False, 그것은 효과가 없습니다. operator.isNumberType() 그러나 Numpy Numbers의 모든 변형에 대해 numpy.array([1]).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top