2
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])
4

1 回答 1

2

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

于 2019-12-07T19:01:14.660 回答