np.array([5.3, 1.2, 76.1, 'Alice', 'Bob', 'Claire'])
我想知道为什么这给出了 dtype=U32 的 dtype,但是下面的代码给出了 U6 的 dtype。
np.array(['Alice', 'Bob', 'Claire', 5.3, 1.2, 76.1])
np.array([5.3, 1.2, 76.1, 'Alice', 'Bob', 'Claire'])
我想知道为什么这给出了 dtype=U32 的 dtype,但是下面的代码给出了 U6 的 dtype。
np.array(['Alice', 'Bob', 'Claire', 5.3, 1.2, 76.1])
Numpy 通过计算存储对象需要多少位来尝试在存储数据类型时提高效率。
import np
a = np.array([5.3, 1.2, 76.1, 'Alice', 'Bob', 'Claire'])
b = np.array(['Alice', 'Bob', 'Claire', 5.3, 1.2, 76.1])
print(a.dtype, b.dtype)
>>> <U32 <U6
由于数据类型转换规则, Numpy 看到5.3
并将其放入一个 32 码点数据类型的数据类型中:
数据类型(整数、浮点数、Python 对象等)
数据的大小(例如整数中有多少字节)
数据的字节顺序(小端或大端)
如果数据类型是结构化数据类型,其他数据类型的聚合,(例如,描述由整数和浮点数组成的数组项),
可以访问它们的结构的“字段”的名称是什么,
每个字段的数据类型是什么,以及
每个字段占用内存块的哪一部分。
如果数据类型是子数组,它的形状和数据类型是什么。
当它看到数组中的其他字符串时,它们可以适合 32 码点数据类型,因此不必更改。
现在,考虑第二个例子。Numpy 看到Alice
并将其放入可以容纳六位的数据类型中。Numpy 继续并看到5.3
,它也可以适合 6 码点数据类型。所以不需要升级。
同样,当运行np.array(['Alice', 'Bob', 'Claire', 5.3, 1.2, 76.1, 'Bobby', 2.3000000000001])
它时U15
,Numpy 看到2.3000000000001
并发现它正在使用的数据类型不够大,无法容纳2.3000000000001
,然后升级它。
https://numpy.org/devdocs/reference/arrays.dtypes.html#arrays-dtypes