numpy.array()中的dtype参数

时间:2015-08-28 07:37:25

标签: python numpy

我试图理解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:dtype。最小数据类型。

我误解了什么吗?

1 个答案:

答案 0 :(得分:2)

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列表对象。 / p>

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数组,那么dtype必须足够大以容纳两个对象,在本例中为int64。

In [51]: np.array([ten, 10]).dtype
Out[51]: dtype('int64')