6

我想根据给定 NumPy 所暗示的约束测试一个未知值dtype——例如,如果我有一个整数值,它是否足够小以适合 a uint8

据我所知,NumPy 的dtype架构并没有提供这样的方法:

### FICTIONAL NUMPY CODE: I made this up ###
try:
    numpy.uint8.validate(rupees)
except numpy.dtype.ValidationError:
    print "Users can't hold more than 255 rupees."

我的小幻想 API 基于 Django 的模型字段验证器,但这只是一个例子——我设法设计的最佳机制是这样的:

>>> nd = numpy.array([0,0,0,0,0,0], dtype=numpy.dtype('uint8'))
>>> nd[0]
0
>>> nd[0] = 1
>>> nd[0] = -1
>>> nd
array([255,   0,   0,   0,   0,   0], dtype=uint8)
>>> nd[0] = 257
>>> nd
array([1, 0, 0, 0, 0, 0], dtype=uint8)

通过numpy.ndarraytyped as 显式地将可疑值往返numpy.uint8返回给我已包装成具有适当大小的整数的整数 - 不会抛出异常或引发任何其他类型的可操作错误状态。

当然,我宁愿不穿建筑宇航员飞行服,但这是更可取的选择,这看起来像是无法维护的意大利面条怪物混乱的if dtype(this) ... elif dtype(that)陈述。除了开始编写自己的 API 的宏伟而放纵的行为之外,我还能在这里做些什么吗?

4

3 回答 3

6

如果a是您的原始可迭代对象,您可以执行以下操作:

np.all(np.array(a, dtype=np.int8) == a)

很简单,这会将结果ndarray与原始值进行比较,并告诉您转换ndarray是否是无损的。

这也将捕获诸如使用太窄而无法准确表示某些值的浮点类型之类的事情:

>>> a = [0, 0, 0, 0, 0, 0.123456789]
>>> np.all(np.array(a, dtype=np.float32) == a)
False
>>> np.all(np.array(a, dtype=np.float64) == a)
True

编辑:将上述代码与浮点数一起使用时需要注意的一个问题是,NaN 总是比较不相等。如果需要,扩展代码来处理这种情况也很简单。

于 2012-11-06T22:41:02.073 回答
1

看看numpy iinfo / finfo结构。他们应该提供适用于基本数据类型的验证服务所需的所有信息。这不适用于复合或二进制字段 dtype。您仍然需要为此实现服务框架。

于 2013-10-30T15:26:44.643 回答
0

尝试使用numpy.seterr()withover以在溢出时触发警告/错误。

例如

numpy.seterr(over='raise')
于 2012-11-06T22:41:09.943 回答