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))
但是我应该在列表中包含其他数字类型吗?
答案 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
定义不明确。请参阅我对您问题的评论。
其他数字类型可以是:long
,complex
,fractions.Fraction
,numpy.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])
。