标量

python只定义特定数据类的一种类型(只有一种整数类型、一种浮点类型等)。这在不需要关心数据在计算机中的所有表示方式的应用程序中是很方便的。然而,对于科学计算,往往需要更多的控制。

在numpy中,有24个新的基本python类型来描述不同类型的scalar。这些类型描述符主要基于编写c python所用的C语言中可用的类型,以及与Python类型兼容的其他几个类型。

数组标量的属性和方法与 ndarrays . 1 这样可以将数组中的项部分地与数组放在同一个基脚上,从而平滑混合标量和数组操作时产生的粗糙边。

数组标量位于数据类型的层次结构中(参见下图)。可以使用层次结构检测它们:例如, isinstance(val, np.generic) 将返回 True 如果 val 是数组标量对象。或者,可以使用数据类型层次结构的其他成员来确定存在哪种数组标量。因此,例如 isinstance(val, np.complexfloating) 将返回 True 如果 val 是复杂值类型,而 isinstance(val, np.flexible) 如果 val 是灵活的itemsize数组类型之一 (str_bytes_void

../_images/dtype-hierarchy.png

图: 表示数组数据类型的类型对象的层次结构。未显示的是两种整数类型 intpuintp 它只指向保存平台指针的整数类型。所有的数字类型也可以使用位宽度名称获得。

1

但是,数组标量是不可变的,因此数组标量属性都不可设置。

内置标量类型

内置标量类型如下所示。类似C的名称与字符代码相关联,字符代码显示在它们的描述中。但是,不鼓励使用字符代码。

一些标量类型本质上等同于基本的python类型,因此继承自这些类型以及泛型数组标量类型:

数组标量类型

相关的python类型

继承?

int_

int

仅Python 2

float_

float

complex_

complex

bytes_

bytes

str_

str

bool_

bool

datetime64

datetime.datetime

timedelta64

datetime.timedelta

这个 bool_ 数据类型与python非常相似 bool 但不会从中继承,因为python的 bool 不允许从继承自身,并且在C级别上,实际bool数据的大小与python布尔标量不同。

警告

这个 int_ 类型做 not 继承自 int 在python 3下内置,因为类型 int 不再是固定宽度整数类型。

小技巧

numpy中的默认数据类型为 float_ .

class numpy.generic[源代码]

numpy标量类型的基类。

从哪个类开始(全部?)派生numpy标量类型。为了一致性,公开与 ndarray 尽管许多后续属性要么是“只获取”,要么完全不相关。这是强烈建议用户从中派生自定义标量类型的类。

class numpy.number[源代码]

所有数值标量类型的抽象基类。

整数类型

class numpy.integer[源代码]

所有整数标量类型的抽象基类。

有符号整数类型

class numpy.signedinteger[源代码]

所有有符号整数标量类型的抽象基类。

class numpy.byte[源代码]

有符号整数类型,与C兼容 char .

字符码

'b'

此平台上的别名

numpy.int8 :8位有符号整数 (-128127

class numpy.short[源代码]

有符号整数类型,与C兼容 short .

字符码

'h'

此平台上的别名

numpy.int16 :16位有符号整数 (-32_76832_767

class numpy.intc[源代码]

有符号整数类型,与C兼容 int .

字符码

'i'

此平台上的别名

numpy.int32 :32位有符号整数 (-2_147_483_6482_147_483_647

class numpy.int_[源代码]

有符号整数类型,与Python兼容 int 和C long .

字符码

'l'

此平台上的别名

numpy.int64 :64位有符号整数 (-9_223_372_036_854_775_8089_223_372_036_854_775_807

此平台上的别名

numpy.intp :大到足以容纳指针的有符号整数,与C兼容 intptr_t .

class numpy.longlong[源代码]

有符号整数类型,与C兼容 long long .

字符码

'q'

无符号整数类型

class numpy.unsignedinteger[源代码]

所有无符号整数标量类型的抽象基类。

class numpy.ubyte[源代码]

无符号整数类型,与C兼容 unsigned char .

字符码

'B'

此平台上的别名

numpy.uint8 :8位无符号整数 (0255

class numpy.ushort[源代码]

无符号整数类型,与C兼容 unsigned short .

字符码

'H'

此平台上的别名

numpy.uint16 :16位无符号整数 (065_535

class numpy.uintc[源代码]

无符号整数类型,与C兼容 unsigned int .

字符码

'I'

此平台上的别名

numpy.uint32 :32位无符号整数 (04_294_967_295

class numpy.uint[源代码]

无符号整数类型,与C兼容 unsigned long .

字符码

'L'

此平台上的别名

numpy.uint64 :64位无符号整数 (018_446_744_073_709_551_615

此平台上的别名

numpy.uintp :大到可以容纳指针的无符号整数,与C兼容 uintptr_t .

class numpy.ulonglong[源代码]

有符号整数类型,与C兼容 unsigned long long .

字符码

'Q'

不精确类型

class numpy.inexact[源代码]

所有数值标量类型的抽象基类,其范围内的值(可能)表示不精确,例如浮点数。

浮点类型

class numpy.floating[源代码]

所有浮点标量类型的抽象基类。

class numpy.half[源代码]

半精度浮点数类型。

字符码

'e'

此平台上的别名

numpy.float16 :16位精度浮点数类型:符号位、5位指数、10位尾数。

class numpy.single[源代码]

单精度浮点数类型,与C兼容 float .

字符码

'f'

此平台上的别名

numpy.float32 :32位精度浮点数类型:符号位、8位指数、23位尾数。

class numpy.double(x=0, /)[源代码]

双精度浮点数类型,与Python兼容 float 和C double .

字符码

'd'

别名

numpy.float_

此平台上的别名

numpy.float64 :64位精度浮点数类型:符号位、11位指数、52位尾数。

class numpy.longdouble[源代码]

扩展精度浮点数类型,与C兼容 long double 但不一定是ieee754四倍精度。

字符码

'g'

别名

numpy.longfloat

此平台上的别名

numpy.float128 :128位扩展精度浮点数类型。

复杂浮点类型

class numpy.complexfloating[源代码]

由浮点数组成的所有复数标量类型的抽象基类。

class numpy.csingle[源代码]

由两个单精度浮点数组成的复数类型。

字符码

'F'

别名

numpy.singlecomplex

此平台上的别名

numpy.complex64 :由2个32位精度浮点数组成的复数类型。

class numpy.cdouble(real=0, imag=0)[源代码]

由两个双精度浮点数组成的复数类型,与Python兼容 complex .

字符码

'D'

别名

numpy.cfloat

别名

numpy.complex_

此平台上的别名

numpy.complex128 :由2个64位精度浮点数组成的复数类型。

class numpy.clongdouble[源代码]

由两个扩展精度浮点数组成的复数类型。

字符码

'G'

别名

numpy.clongfloat

别名

numpy.longcomplex

此平台上的别名

numpy.complex256 :由2个128位扩展精度浮点数组成的复数类型。

其他类型

class numpy.bool_[源代码]

布尔类型(True或False),存储为字节。

警告

这个 bool_ 类型不是 int_ 类型 bool_ 甚至不是数字类型)。这不同于python的默认实现 bool 作为 int .

字符码

'?'

别名

numpy.bool8

class numpy.datetime64[源代码]

存储为64位整数的日期时间,从 1970-01-01T00:00:00 .

>>> np.datetime64(10, 'Y')
numpy.datetime64('1980')
>>> np.datetime64(10, 'D')
numpy.datetime64('1970-01-11')

日期时间和时间增量 更多信息。

字符码

'M'

class numpy.timedelta64[源代码]

存储为64位整数的时间增量。

日期时间和时间增量 更多信息。

字符码

'm'

class numpy.object_[源代码]

任何Python对象。

字符码

'O'

注解

实际存储在对象数组中的数据( i.e. ,具有数据类型的数组 object_ )是对python对象的引用,而不是对象本身。因此,对象数组的行为更像通常的Python lists 从某种意义上说,它们的内容不必是相同的Python类型。

对象类型也是特殊的,因为包含 object_ 项目不返回 object_ 对象,但返回数组项引用的实际对象。

以下数据类型是 灵活的 :它们没有预先定义的大小,它们描述的数据在不同的数组中可以有不同的长度。(在字符代码中 # 是一个整数,表示数据类型由多少个元素组成。)

class numpy.flexible[源代码]

没有预定义长度的所有标量类型的抽象基类。这些类型的实际大小取决于特定的 np.dtype 实例化。

class numpy.bytes_[源代码]

字节字符串。

在数组中使用时,此类型会剥离尾部的空字节。

字符码

'S'

别名

numpy.string_

class numpy.str_[源代码]

unicode字符串。

在数组中使用时,此类型会剥离尾随的空代码点。

不像内置的 str ,这支持 Buffer Protocol ,将其内容显示为UCS4:

>>> m = memoryview(np.str_("abc"))
>>> m.format
'3w'
>>> m.tobytes()
b'a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00'
字符码

'U'

别名

numpy.unicode_

class numpy.void[源代码]

不透明的字节序列或结构。

>>> np.void(b'abcd')
void(b'\x61\x62\x63\x64')

结构化的 void 标量只能通过从 结构化数组

>>> arr = np.array((1, 2), dtype=[('x', np.int8), ('y', np.int8)])
>>> arr[()]
(1, 2)  # looks like a tuple, but is `np.void`
字符码

'V'

警告

Note on string types .

数字兼容性:如果在数字代码中使用旧的类型代码字符(这是从未被推荐过的),则需要将其中一些字符更改为新字符。特别是,所需的更改是 c -> S1b -> B1 -> bs -> hw -> Hu -> I . 这些更改使类型字符约定与其他Python模块(如 struct 模块。

大小别名

除了它们的(大部分)C派生名称之外,integer、float和complex数据类型也可以使用位宽度约定,这样就可以始终确保正确大小的数组。两个别名 (numpy.intpnumpy.uintp )指向hold类型的指针C也足够大。

numpy.bool8[源代码]

alias of numpy.bool_

numpy.int8[源代码]
numpy.int16
numpy.int32
numpy.int64

有符号整数类型的别名(其中一个 numpy.bytenumpy.shortnumpy.intcnumpy.int_numpy.longlong )具有指定的位数。

与C99兼容 int8_tint16_tint32_tint64_t ,分别。

numpy.uint8[源代码]
numpy.uint16
numpy.uint32
numpy.uint64

无符号整数类型的别名(其中一个 numpy.bytenumpy.shortnumpy.intcnumpy.int_numpy.longlong )具有指定的位数。

与C99兼容 uint8_tuint16_tuint32_tuint64_t ,分别。

numpy.intp[源代码]

有符号整数类型的别名(其中一个 numpy.bytenumpy.shortnumpy.intcnumpy.int_np.longlong )与指针大小相同。

与C兼容 intptr_t .

字符码

'p'

numpy.uintp[源代码]

无符号整数类型的别名(其中一个 numpy.bytenumpy.shortnumpy.intcnumpy.int_np.longlong )与指针大小相同。

与C兼容 uintptr_t .

字符码

'P'

numpy.float16[源代码]

alias of numpy.half

numpy.float32[源代码]

alias of numpy.single

numpy.float64[源代码]

alias of numpy.double

numpy.float96
numpy.float128[源代码]

Alias numpy.longdouble ,以其大小(位)命名。这些别名的存在取决于平台。

numpy.complex64[源代码]

alias of numpy.csingle

numpy.complex128[源代码]

alias of numpy.cdouble

numpy.complex192
numpy.complex256[源代码]

Alias numpy.clongdouble ,以其大小(位)命名。这些别名的存在取决于平台。

其他别名

前两个是类似于内置类型名称的便利,与 bool_int_str_bytes_object_

numpy.float_[源代码]

alias of numpy.double

numpy.complex_[源代码]

alias of numpy.cdouble

还有一些对扩展精度浮点和复数使用替代命名约定:

numpy.longfloat[源代码]

alias of numpy.longdouble

numpy.singlecomplex[源代码]

alias of numpy.csingle

numpy.cfloat[源代码]

alias of numpy.cdouble

numpy.longcomplex[源代码]

alias of numpy.clongdouble

numpy.clongfloat[源代码]

alias of numpy.clongdouble

以下别名源于python2,建议不要在新代码中使用它们。

numpy.string_[源代码]

alias of numpy.bytes_

numpy.unicode_[源代码]

alias of numpy.str_

属性

数组标量对象具有 array priority 属于 NPY_SCALAR_PRIORITY (-1000000.0)。他们还没有 ctypes 属性。否则,它们与数组共享相同的属性:

generic.flags 

标志的整数值。

generic.shape 

数组维度的元组。

generic.strides 

每个维度中的字节步骤的元组。

generic.ndim 

数组维数。

generic.data 

指向数据开头的指针。

generic.size 

gentype中的元素数。

generic.itemsize 

一个元素的长度(字节)。

generic.base 

与对应数组属性相同的标量属性。

generic.dtype 

获取数组数据描述符。

generic.real 

标量的实部。

generic.imag 

标量的虚部。

generic.flat 

标量的一维视图。

generic.T 

与对应数组属性相同的标量属性。

generic.__array_interface__ 

阵列协议:python端

generic.__array_struct__ 

数组协议:结构

generic.__array_priority__ 

数组优先级。

generic.__array_wrap__ 

sc.“数组”从数组返回标量

索引

数组标量可以像0维数组一样进行索引:如果 x 是数组标量,

  • x[()] 返回数组标量的副本

  • x[...] returns a 0-dimensional ndarray

  • x['field-name'] 返回字段中的数组标量 field-name . ( x 例如,当字段对应于结构化数据类型时,可以有字段。)

方法

数组标量的方法与数组完全相同。这些方法的默认行为是在内部将标量转换为等效的0维数组,并调用相应的数组方法。此外,还定义了数组标量上的数学运算,以便设置相同的硬件标志,并用于解释结果 ufunc 这样,UFUNC所使用的错误状态也将转移到数组标量上的数学。

上述规则的例外情况如下:

generic.__array__ 

sc.“数组”(dtype)从具有指定dtype的标量返回0-dim数组

generic.__array_wrap__ 

sc.“数组”从数组返回标量

generic.squeeze 

与对应数组属性相同的标量方法。

generic.byteswap 

与对应数组属性相同的标量方法。

generic.__reduce__ 

泡菜助手。

generic.__setstate__ 

generic.setflags 

与对应数组属性相同的标量方法。

定义新类型

有两种方法可以有效地定义新的数组标量类型(除了组合结构化类型之外 dtypes 从内置的标量类型):一种方法是简单地将 ndarray 改写感兴趣的方法。这在一定程度上是可行的,但在内部某些行为是由数组的数据类型固定的。要完全自定义数组的数据类型,需要定义一个新的数据类型,并用numpy注册它。此类新类型只能在C中定义,使用 NumPy C-API .