Python 为什么numpy在调用searchsorted时会将我的int数组静默地转换为字符串?
我在我的代码中发现了一个严重的错误,我忘记将一个整数从Python 为什么numpy在调用searchsorted时会将我的int数组静默地转换为字符串?,python,arrays,numpy,type-conversion,binary-search,Python,Arrays,Numpy,Type Conversion,Binary Search,我在我的代码中发现了一个严重的错误,我忘记将一个整数从str转换为int,然后在一个排序的整数数组中查找它。在修复了它之后,我仍然感到惊讶的是,这并没有导致显式异常 下面是一个演示: In [1]: import numpy as np In [2]: a = np.arange(1000, dtype=int) In [3]: a.searchsorted('15') Out[3]: 150 In [4]: a.searchsorted('150') Out[4]: 150 In [5
str
转换为int
,然后在一个排序的整数数组中查找它。在修复了它之后,我仍然感到惊讶的是,这并没有导致显式异常
下面是一个演示:
In [1]: import numpy as np
In [2]: a = np.arange(1000, dtype=int)
In [3]: a.searchsorted('15')
Out[3]: 150
In [4]: a.searchsorted('150')
Out[4]: 150
In [5]: a.searchsorted('1500')
Out[5]: 151
In [6]: a.searchsorted('foo')
Out[6]: 1000
对于
float
数组,这不起作用,引发了TypeError:无法将数组数据从dtype('float64')强制转换为dtype(')。发生这种行为是因为searchsorted
要求针和草堆具有相同的dtype。这是使用np.promotion\u types
实现的,它具有行为:
>>> np.promote_types(int, str)
dtype('S11')
这意味着要获得整数haystack和字符串指针的匹配数据类型,唯一有效的转换是将haystack转换为字符串类型
一旦我们有了一个通用的数据类型,我们就可以检查是否可以与np一起使用。can_cast
。这就解释了为什么浮点不能转换为字符串,而int是:
In [1]: np.can_cast(np.float, np.promote_types(np.float, str))
Out[1]: False
In [2]: np.can_cast(np.int, np.promote_types(np.int, str))
Out[2]: True
总而言之,奇怪的行为是升级规则(其中numeric+string=>string)和强制转换规则(其中int=>string是允许的)的组合。在我看来像是个bug。我建议提交一份bug报告。@MrFooz我发现了它,它帮助我看到了其中的一些逻辑,但它仍然不能回答我所有的问题。bug报告肯定会非常欢迎。@Jaime: