防止numpy将数值转换为字符串

时间:2018-08-03 13:07:43

标签: python python-3.x numpy

通常,我对numpy确定在np.array中保存序列对象所需的最小类型的方式感到满意:

>>> print(np.array([42, 4.2]))
array([42, 4.2], dtype=float64)

这很直观:我需要将一个整数向上转换为浮点数才能处理数据。

但是,以下情况对我而言似乎不太直观:

>>> print(np.array([42, 4.2, 'aa']))
array(['42', '4.2', 'aa'], dtype='<U32')

我希望结果数组的类型为np.object。我不想打电话

np.array(ma_list, dtype=np.object)

因为在my_list=[42, 4.2]的情况下以及在my_list=['aa']的情况下我都会保留旧的行为(这会导致类型为<U2)。

是否可以调整默认行为以防止将数字值向上转换为字符串,或者是否有任何具有相同效果的解决方法?

2 个答案:

答案 0 :(得分:2)

在让numpy确定数据类型之前,您似乎需要对数据进行一些预处理。根据我对您的条件的了解,如果列表中的所有对象都是数字,或者它们都不是数字,则需要让numpy确定类型。如果类别混合,则要使用np.object

幸运的是,Python中的所有数字都具有抽象基类numbers.Number的关联:

from numbers import Number

isnum = lambda x: isinstance(x, Number)
isntnum = lambda x: not isinstance(x, Number)
if all(map(isnum, my_list)) or all(map(isntnum, my_list)):
    dtype = None
else:
    dtype = np.object

my_arr = np.array(my_list, dtype=dtype)

这里的措词不是理想的,但它应该有效,并为您提供一些更优雅,更高效的起点。

答案 1 :(得分:0)

浏览完大约30分钟内可以使用的所有C代码后,我得出结论认为,没有什么好办法。

我最好的选择是:

a = np.array([4.2,42,'42'])
if str(a.dtype)[:2]=='<U':
    a = np.array([4.2,42,'42'],dtype=np.object)

我会承认这确实很不可靠,因为它依赖于np.array将这些字符串/浮点数组强制转换为unicode数据类型的事实,但它至少在小型数组上应该能很好地工作。