在numpy中识别数字和数组类型

时间:2009-02-01 06:17:39

标签: python numpy

numpy中是否存在一个函数,告诉我一个值是数字类型还是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))

但是我应该在列表中包含其他数字类型吗?

5 个答案:

答案 0 :(得分:18)

正如其他人所回答的那样,除了你提到的那些之外,还有其他数字类型。 一种方法是明确检查您想要的功能,例如

# 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

但是根据您计划调用的频率使用它以及使用什么参数,这可能不实用(它可能很慢,例如使用大型数组)。

答案 1 :(得分:5)

通常,处理未知类型的灵活,快速和pythonic方法是只对它们执行一些操作并捕获无效类型的异常。

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

在我看来,这种方法比特殊的方法容易一些,以确定绝对类型的确定性。

答案 2 :(得分:4)

此外,numpy有numpy.isreal和其他类似的功能(numpy.is + Tab应该列出它们。)

他们都有他们有趣的角落案例,但其中一个可能有用。

答案 3 :(得分:0)

您的is_numeric定义不明确。请参阅我对您问题的评论。

其他数字类型可以是:longcomplexfractions.Fractionnumpy.bool_numpy.ubyte,...

operator.isNumberType()为Python数字和True返回numpy.array

从Python 2.6开始,您可以使用isinstance(d, numbers.Number)而不是弃用operator.isNumberType()

通常最好检查对象的功能(例如,是否可以向其添加整数)而不是其类型。

答案 4 :(得分:0)

isinstance(numpy.int32(4), numbers.Number)会返回False,因此效果不佳。 operator.isNumberType()确实适用于numpy数字的所有变体,包括numpy.array([1])