为什么numpy追加空列表时会出现奇怪的隐式类型转换
numpy
np.append 类型转换问题原因解析 np.append 的底层逻辑是先将输入的两个参数都转换为numpy数组,再调用np.concatenate完成拼接,拼接过程中numpy会自动将两个数组的类型向上转换为可兼容所有值的公共类型,上述现象完全由这个逻辑导致。
第一种场景:np.append(a, []) 输出float类型数组
空Python列表[]没有明确的元素类型信息,numpy默认会将其转换为dtype=float64的空数组,可直接执行print(np.array([]).dtype)验证。
此时待拼接的两个数组分别是dtype=int的a,和dtype=float的空数组,二者的公共兼容类型为float,因此拼接结果会将所有元素转换为float类型,最终输出array([1., 2., 3.])。
第二种场景:np.append(a, [4]) 输出int类型数组
非空列表[4]包含Python int类型元素,numpy会自动将其转换为dtype=int的数组。
此时待拼接的两个数组都是int类型,公共兼容类型仍为int,因此不会发生额外的类型转换,最终输出保持int类型的array([1, 2, 3, 4])。
避免意外类型转换的方法
如果需要追加空数组且保持原类型,可以手动指定空数组的dtype和原数组一致:
c = np.append(a, np.array([], dtype=a.dtype))
此时输出的c就是和原数组一致的int类型。
内容的提问来源于stack exchange,提问作者kstn
相关产品推荐
相关产品推荐

