numpy.array() 中的 dtype 参数

4
我正在尝试理解Numpy中dtypes的逻辑。
numpy.min_scalar_type(10)
-> uint8

并且:

a = numpy.array([10])
print(a.dtype)
-> int32 (on my machine)

我原本期望的是uint8而不是int32,因为(1.9)文档如下:

numpy.array(object, dtype=None, ...)

dtype : 数据类型,可选参数。数组中所需的数据类型。如果未给出,则类型将被确定为容纳序列中对象所需的最小类型。

还有:

numpy.min_scalar_type(a)

对于标量a,返回可以保存其值的最小大小和最小标量类型的数据类型。

...

返回结果:out : 数据类型。最小的数据类型。

我是否有什么误解?


我得到了 a.dtypeint64 - Paul
@Paul。这取决于Python的版本。 - M. Page
1
这有点含糊不清,但我认为关键是要理解“最小类型”和“具有最小大小的最小类型”通常是不同的。np.array 给你的是“最小类型”。最小类型是整数,它并没有给你最小尺寸的整数类型(这是完全合理的)。 - cel
1
@cel。我明白了。最小类型是关于类型层次结构的,而不是类型大小。但是,由于signedinteger和unsignedinteger不在dtype层次结构的同一分支中(http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html),因此最小类型并不唯一。那么为什么它返回int32(或int64)而不是uint32(或uint64)? - M. Page
1个回答

4

Python列表可以包含不同类型的对象,例如X = ['apples', 'oranges',10]。 如果您执行type([10]),则会看到容器的Python类型技术上称为列表而不是数组。

相比之下,在numpy数组中,所有对象都是相同类型的,即dtype。

文档告诉您,在创建numpy数组时,dtype设置为将容纳所有现有对象的类型。

看,就像这样:

类型将被确定为容纳序列中所有对象所需的最小类型

作者也许应该添加“而不是它们的值”

我们可以很容易地创建一个uint8:

ten = np.uint8(10)

如果将其放入 Python 列表中,则会保留其类型,因为 Python 列表会保留类型。 如果将该列表发送到 numpy.array() 来创建一个 numpy 数组,则 numpy 数组将使用 dtype np.uint8,因为它足够大以容纳全部(1个)预先存在的 Python 列表对象。

In [49]: np.array([ten]).dtype
Out[49]: dtype('uint8')

但是,如果我们使用文字字面量10,Python将为其创建一个int对象,而不是一个np.uint8对象,因为np.uint8只适用于NumPy,而所有10做的就是调用Python来创建该数字。
如果我们创建一个包含文字字面量10的Python列表,我们将复制您的结果(使用机器架构整数):
In [50]: np.array([10]).dtype
Out[50]: dtype('int64')

如果我们将这两种类型放在Python列表中,并将该列表发送到 np.array 以创建NumPy数组,则数据类型必须足够大以容纳这两个对象,本例中为int64。
In [51]: np.array([ten, 10]).dtype
Out[51]: dtype('int64')

1
这是一个非常好的解释! - M. Page
谢谢。我很高兴你明白了。 - Paul
我会写Python列表而不是Python数组。还有一个不太常用的Array模块。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接