通常,我对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
)。
是否可以调整默认行为以防止将数字值向上转换为字符串,或者是否有任何具有相同效果的解决方法?
答案 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数据类型的事实,但它至少在小型数组上应该能很好地工作。