通常,我对 numpy 确定保存 np.array
中序列对象所需的最小类型的方式感到满意。 :
>>> print(np.array([42, 4.2]))
array([42, 4.2], dtype=float64)
这非常直观:我需要将整数向上转换为 float 才能处理数据。
但是,以下情况对我来说似乎不太直观:
>>> 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
)。
是否可以调整默认行为以防止将数值向上转换为字符串,或者是否有任何具有相同效果的解决方法?
最佳答案
看起来您想在让 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)
这里的措辞并不理想,但它应该有效,并为您提供一个更优雅和更高效的起点。
关于python - 防止 numpy 将数值向上转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51673388/