谁能帮我理解Numpy的数组函数从哪里推断数据类型?
我理解它基本上是从分配给数组的值的类型来推断的。
例如:
> data = [1,2,3,4]
> arr = np.array(data)
所以在上面的行中,"arr"将包含dtype('int64')
或dtype('int32')
。
我想了解的是它是如何决定是否给它一个int64
或int32
的?
我知道这可能是一个微不足道的问题,但我只是想了解它是如何工作的,因为我最近在一次采访中被问到这个问题。
数值数据类型包括整数和浮点数。
如果我们有一个同时包含integers
和floating point numbers
的数组,numpy
会将整个数组赋值给float
数据类型,这样小数点就不会丢失。
整数不能有小数点。例如,2.55将存储为2
正如@unutbu提到的int32
和int64
取决于您拥有的位机类型,是32位机还是64位机
Strings
,是包含numbers
和/或characters
的值。例如,字符串可以是一个单词、一个句子或几个句子。如果你的数组有混合类型(数字和字符串),最通用的dtype=string
将被分配给你的数组。
要获得完整的详细信息,您可以查看scipy docs
根据文档,
某些类型,如int和intp,有不同的位大小,这取决于平台(例如32位机器和64位机器)。
因此,在32位机器上,np.array([1,2,3,4])
返回d类型为int32
的数组,但在64位机器上,它返回d类型为int64
的数组。
在Python3(和基本的32位机器)中,int32 v int64取决于输入
的大小。In [447]: np.array(123456789)
Out[447]: array(123456789)
In [448]: _.dtype
Out[448]: dtype('int32')
In [449]: np.array(12345678901234)
Out[449]: array(12345678901234, dtype=int64)
From np.array
docs:
dtype:数组所需的数据类型。如果没有给出,那么型号将根据所需的最小型号确定保存序列中的对象。这个论点只能用于"上转换"数组。
看起来int32
是最小的默认int大小(至少在我的配置中)。也是np.int_
的值。
作为一个不允许的向下转换的例子:
In [456]: np.array(12345678901234, dtype=np.int32)
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-456-da7c96e4b0b3> in <module>()
----> 1 np.array(12345678901234, dtype=np.int32)
OverflowError: Python int too large to convert to C long
我认为存在某种分层处理,它使用最保守但又包罗万象的类型,可以"合法"地表示输入。如果你只有整数,你将使用int32/64保留所有的元素。一旦引入浮点数,就需要使用float32/64来保留数组的所有元素,并且始终可以将float
反转换为int
。一旦引入了字符串,就需要使用字符串来合法地表示数组中的所有内容,而且,如果需要
float
或int
。,
>>> array([1]).dtype
dtype('int64')
>>> array([1, 2.0]).dtype
dtype('float64')
>>> array([1, 2.0, 'a']).dtype
dtype('S3')
简而言之,这是相当聪明的;)