gpt4 book ai didi

python - 识别 numpy 中的数字和数组类型

转载 作者:太空狗 更新时间:2023-10-29 17:13:32 24 4
gpt4 key购买 nike

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

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

最佳答案

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

# 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

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

关于python - 识别 numpy 中的数字和数组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/500328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com