我试图理解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。最小数据类型。
我误解了什么吗?
答案 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')