我正在比较两个不同数组的数据类型,以选择一种适合将两者结合的数据。我很高兴发现自己可以执行比较操作,但是在此过程中发现了以下奇怪的行为:
In [1]: numpy.int16 > numpy.float32
Out[1]: True
In [2]: numpy.dtype('int16') > numpy.dtype('float32')
Out[2]: False
谁能解释这是怎么回事?这是NumPy 1.8.2。
第一个比较是没有意义的,第二个是有意义的。
随着numpy.int16 > numpy.float32
我们比较两个type
对象:
>>> type(numpy.int16)
type
>>> numpy.int16 > numpy.float32 # I'm using Python 3
TypeError: unorderable types: type() > type()
在Python 3中,由于没有type
实例的定义顺序,因此该比较立即失败。在Python 2中,返回了一个布尔值,但不能依靠它来保持一致性(它返回比较内存地址或其他实现级别的东西)。
第二个比较在Python 3中确实有效,并且一致地工作(在Python 2中相同)。这是因为我们现在正在比较dtype
实例:
>>> type(numpy.dtype('int16'))
numpy.dtype
>>> numpy.dtype('int16') > numpy.dtype('float32')
False
>>> numpy.dtype('int32') < numpy.dtype('|S10')
False
>>> numpy.dtype('int32') < numpy.dtype('|S11')
True
此命令背后的逻辑是什么?
dtype
根据是否可以(安全地)将实例强制转换为另一实例来对实例进行排序。如果可以安全地强制转换为该类型,则该类型将小于另一类型。
对于比较运算符的实现,请查看descriptor.c;特别是在arraydescr_richcompare
功能上。
这是<
操作员映射到的内容:
switch (cmp_op) {
case Py_LT:
if (!PyArray_EquivTypes(self, new) && PyArray_CanCastTo(self, new)) {
result = Py_True;
}
else {
result = Py_False;
}
break;
本质上,NumPy仅检查两种类型(i)不相等,以及(ii)第一种类型可以转换为第二种类型。
此功能在NumPy API中也显示为np.can_cast
:
>>> np.can_cast('int32', '|S10')
False
>>> np.can_cast('int32', '|S11')
True
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句