python - 针对 NumPy dtypes 的验证——检查值最不迂回的方法是什么?

标签 python validation numpy introspection typechecking

我想根据给定 NumPy dtype 暗示的约束测试未知值——例如,如果我有一个整数值,它是否足够小以适合 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的model-field validators ,但这只是一个例子——我想出的最好的机制是这样的:

>>> 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.ndarray 的可疑值来回传递 numpy.uint8 给我返回已包装到适当大小的东西的整数 -不会抛出异常,也不会引发任何其他类型的可操作错误状态。

当然,我宁愿不穿上建筑宇航员飞行服,但那是更好的选择,它看起来像 if dtype(this) ... elif dtype(that ) 语句。除了开始编写我自己的 API 的宏伟和放纵行为之外,我还能做些什么吗?

最佳答案

如果 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

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

关于python - 针对 NumPy dtypes 的验证——检查值最不迂回的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13260531/

相关文章:

python - 如何使用 tkinter/python 检测在键盘/鼠标上按下了哪个键?

php - 使用 postgres 约束进行表单验证

python - 来自最小值和最大值之间的指数分布的随机整数

numpy - 如何使用 Numpy 函数实现泄漏的 relu

xml - XML 验证器如何知道在哪里可以找到在 xml 文档中声明的模式实例以便解析和使用 xsd?

python - fatal error : numpy/arrayobject. h:没有那个文件或目录

python - 使用 matplotlib 时设置 xlim 和 ylim(有些奇怪)

python - Python Anaconda Windows 10 的 XGBoost 安装问题(2018 年 5 月 18 日)

python - 如何在 Django 中获取 super 用户详细信息?

javascript - 到达数组末尾后如何执行函数?