首页 > 解决方案 > 为什么 np.array([1, "a"]) 使用 21 个字符的 Unicode 字符串?

问题描述

当用一个字符检查字符串的数据类型时,我得到的 dtype 为 <U1 符合预期。

print(numpy.array(["a"]).dtype)

Output : <U1

但是在向数组添加一个整数后,为什么它会消耗 21 个字符?

print(numpy.array([1,"a"]).dtype)

Output : <U21

标签: pythonnumpynumpy-dtype

解决方案


为什么要消耗 21 个字符?

因为元素正在被提升,这意味着 numpy 将元素转换为

type1 和 type2 可以安全地转换为的最小尺寸和最小标量类型。

例如,如果我们使用promote_types

print(np.promote_types('i8', '<U1'))

输出

<U21

关于 U21,它由两部分组成,如您所知,U 表示 Unicode,21 表示它可以容纳的元素数量,请参阅此答案的更多信息。

因此,8可以转换为 int64,并且它可以容纳至少 20 个字符(尽管取决于平台),它正在转换为 U21。知道一个数字可以包含的字符数,您可以执行以下操作:

ii64 = np.iinfo(np.int64)
print(ii64)

输出

Machine parameters for int64
---------------------------------------------------------------
min = -9223372036854775808
max = 9223372036854775807
---------------------------------------------------------------

尤其:

print(len(str(ii64.min)))

输出

20

您可以通过以下方式保留 U1:

print(np.array(["a", 1]).dtype) # put the string first

输出

<U1

在这个 GitHub问题上查看更多信息。


推荐阅读