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: