Python仅定义特定数据类的一种类型(只有一种整数类型,一种浮点类型等)。在不需要关注计算机中数据表示方式的所有应用程序中,这很方便。但是,对于科学计算,通常需要更多的控制。
在NumPy中,有24种新的基本Python类型来描述不同类型的标量。这些类型描述符主要基于编写CPython的C语言中可用的类型,以及与Python类型兼容的其他几种类型。
数组标量具有与相同的属性和方法ndarrays
。1这样一来,就可以部分地将数组项与数组放在相同的基础上,从而平滑混合标量和数组操作时产生的粗糙边缘。
数组标量位于数据类型的层次结构中(请参见下图)。可以使用层次结构检测到它们:例如,如果val是一个数组标量对象,
则将返回。或者,可以使用数据类型层次结构的其他成员来确定存在哪种数组标量。因此,例如
将返回如果VAL是一个复值的类型,而
如果将返回true VAL是柔性itemsize阵列类型中的一种(,
,)。isinstance(val, np.generic)
True
isinstance(val, np.complexfloating)
True
isinstance(val, np.flexible)
string
unicode
void
图:表示数组数据类型的类型对象的层次结构。这两个整数类型未显示intp
,
uintp
它们仅指向保存平台指针的整数类型。所有数字类型也可以使用位宽名称获得。¶
但是,数组标量是不可变的,因此无法设置数组标量属性。
内置标量类型如下所示。连同它们的(主要是)C衍生的名称时,整数,浮点数,和复杂的数据类型也可使用位宽度约定,以便正确的大小的阵列可以总是确保(例如int8
,float64
,
complex128
)。还提供了两个别名(intp
和uintp
),它们分别指向足够容纳C指针的整数类型。类似于C的名称与字符代码相关联,如表所示。但是,不建议使用字符代码。
一些标量类型本质上等效于基本Python类型,因此从它们以及从通用数组标量类型继承:
数组标量类型 |
相关Python类型 |
---|---|
|
|
|
|
|
|
|
|
|
|
该bool_
数据类型是非常类似的Python
BooleanType
,但不继承它,因为Python的
BooleanType
不允许自己被继承,并在C级的实际布尔数据的大小是不一样的一个Python布尔标量。
警告
该bool_
类型不是该类型的子类int_
(bool_
甚至不是数字类型)。这与Python bool
作为int的子类的默认实现不同。
小费
NumPy中的默认数据类型为float_
。
在下表中,platform?
表示该类型可能并非在所有平台上都可用。指出了与不同C或Python类型的兼容性:如果两种类型的数据大小相同且以相同的方式解释,则这两种类型是兼容的。
布尔值:
类型 |
备注 |
字符码 |
---|---|---|
|
兼容:Python bool |
|
|
8位 |
整数:
|
兼容:C char |
|
|
兼容:C短 |
|
|
兼容:C int |
|
|
兼容:Python int |
|
|
兼容:C长长 |
|
|
足够大以适合指针 |
|
|
8位 |
|
|
16位 |
|
|
32位 |
|
|
64位 |
无符号整数:
|
兼容:C unsigned char |
|
|
兼容:C unsigned short |
|
|
兼容:C unsigned int |
|
|
兼容:Python int |
|
|
兼容:C长长 |
|
|
足够大以适合指针 |
|
|
8位 |
|
|
16位 |
|
|
32位 |
|
|
64位 |
浮点数字:
|
|
|
|
兼容:C float |
|
|
兼容:C double |
|
|
兼容:Python float |
|
|
兼容:C长浮点 |
|
|
16位 |
|
|
32位 |
|
|
64位 |
|
|
96位,平台? |
|
|
128位,平台? |
复数浮点数:
|
|
|
|
兼容:Python复合体 |
|
|
|
|
|
两个32位浮点数 |
|
|
两个64位浮点数 |
|
|
两个96位浮点数,平台? |
|
|
两个128位浮点数,平台? |
任何Python对象:
|
任何Python对象 |
|
注意
实际存储在对象数组(即具有dtype的数组object_
)中的数据是对Python对象的引用,而不是对象本身。因此,对象数组的行为就更像普通的Python lists
,就意味着它们的内容不必是相同的Python类型。
对象类型也很特殊,因为包含object_
项的数组
不会object_
在项访问时返回对象,而是返回数组项所引用的实际对象。
以下数据类型是灵活的:它们没有预定义的大小,并且它们描述的数据在不同的数组中可以具有不同的长度。(在字符代码中,#
是一个整数,表示数据类型由多少个元素组成。)
|
兼容:Python字节 |
|
|
兼容:Python unicode / str |
|
|
|
警告
请参见有关字符串类型的注释。
数字兼容性:如果您在数字代码中使用了旧的打字字符(从未建议过),则需要将其中一些更改为新字符。尤其是,需要改变,,,,,和。这些更改使类型字符约定与其他Python模块(例如模块)更加一致
。c -> S1
b -> B
1 -> b
s -> h
w ->
H
u -> I
struct
数组标量对象的
(-1,000,000.0)。它们也没有
属性。否则,它们与数组共享相同的属性:array priority
NPY_SCALAR_PRIORITY
ctypes
标志的整数值 |
|
数组维度的元组 |
|
每个维度的字节元组步骤 |
|
数组维数 |
|
数据开始的指针 |
|
基因型中元素的数量 |
|
一个元素的长度(以字节为单位) |
|
基础对象 |
|
获取数组数据描述符 |
|
标量的实部 |
|
标量的虚部 |
|
标量的一维视图 |
|
转置 |
|
数组协议:Python端 |
|
数组协议:struct |
|
阵列优先级。 |
|
sc .__ array_wrap __(obj)从数组返回标量 |
也可以看看
数组标量可以像0维数组一样索引:如果x是数组标量,
x[()]
返回数组标量的副本
x[...]
返回一个0维 ndarray
x['field-name']
在字段field-name中返回数组标量。(例如,当x对应于结构化数据类型时,可以具有字段。)
数组标量具有与数组完全相同的方法。这些方法的默认行为是在内部将标量转换为等效的0维数组并调用相应的数组方法。此外,阵列标量的数学运算被定义,使得在相同的硬件标志被设置,并用于解释结果作为ufunc,使得用于ufuncs错误状态也延续到上阵列标量的数学。
上述规则的例外情况如下:
numpy标量类型的基类。 |
|
sc .__ array __(dtype)从标量中返回具有指定dtype的0维数组 |
|
sc .__ array_wrap __(obj)从数组返回标量 |
|
未实现(虚拟属性) |
|
未实现(虚拟属性) |
|
泡菜的助手。 |
|
未实现(虚拟属性) |
有两种方法可以有效地定义新的数组标量类型(除了从内置标量类型构成结构化类型dtypes之外):一种方法是简单地将子类化
ndarray
并覆盖感兴趣的方法。这将在一定程度上起作用,但是在内部,某些行为由数组的数据类型固定。要完全自定义数组的数据类型,您需要定义一个新的数据类型,并将其注册到NumPy。此类新类型只能使用NumPy C-API在C中定义。