python只定义特定数据类的一种类型(只有一种整数类型、一种浮点类型等)。这在不需要关心数据在计算机中的所有表示方式的应用程序中是很方便的。然而,对于科学计算,往往需要更多的控制。
在numpy中,有24个新的基本python类型来描述不同类型的scalar。这些类型描述符主要基于编写c python所用的C语言中可用的类型,以及与Python类型兼容的其他几个类型。
数组标量的属性和方法与 ndarrays . 1 这样可以将数组中的项部分地与数组放在同一个基脚上,从而平滑混合标量和数组操作时产生的粗糙边。
ndarrays
数组标量位于数据类型的层次结构中(参见下图)。可以使用层次结构检测它们:例如, isinstance(val, np.generic) 将返回 True 如果 val 是数组标量对象。或者,可以使用数据类型层次结构的其他成员来确定存在哪种数组标量。因此,例如 isinstance(val, np.complexfloating) 将返回 True 如果 val 是复杂值类型,而 isinstance(val, np.flexible) 如果 val 是灵活的itemsize数组类型之一 (str_ , bytes_ , void )
isinstance(val, np.generic)
True
isinstance(val, np.complexfloating)
isinstance(val, np.flexible)
str_
bytes_
void
图: 表示数组数据类型的类型对象的层次结构。未显示的是两种整数类型 intp 和 uintp 它只指向保存平台指针的整数类型。所有的数字类型也可以使用位宽度名称获得。¶
intp
uintp
但是,数组标量是不可变的,因此数组标量属性都不可设置。
内置标量类型如下所示。类似C的名称与字符代码相关联,字符代码显示在它们的描述中。但是,不鼓励使用字符代码。
一些标量类型本质上等同于基本的python类型,因此继承自这些类型以及泛型数组标量类型:
数组标量类型
相关的python类型
继承?
int_
int
仅Python 2
float_
float
对
complex_
complex
bytes
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_ .
numpy.
generic
numpy标量类型的基类。
从哪个类开始(全部?)派生numpy标量类型。为了一致性,公开与 ndarray 尽管许多后续属性要么是“只获取”,要么完全不相关。这是强烈建议用户从中派生自定义标量类型的类。
ndarray
number
所有数值标量类型的抽象基类。
integer
所有整数标量类型的抽象基类。
signedinteger
所有有符号整数标量类型的抽象基类。
byte
有符号整数类型,与C兼容 char .
char
'b'
numpy.int8 :8位有符号整数 (-128 到 127 )
numpy.int8
-128
127
short
有符号整数类型,与C兼容 short .
'h'
numpy.int16 :16位有符号整数 (-32_768 到 32_767 )
numpy.int16
-32_768
32_767
intc
有符号整数类型,与C兼容 int .
'i'
numpy.int32 :32位有符号整数 (-2_147_483_648 到 2_147_483_647 )
numpy.int32
-2_147_483_648
2_147_483_647
有符号整数类型,与Python兼容 int 和C long .
long
'l'
numpy.int64 :64位有符号整数 (-9_223_372_036_854_775_808 到 9_223_372_036_854_775_807 )
numpy.int64
-9_223_372_036_854_775_808
9_223_372_036_854_775_807
numpy.intp :大到足以容纳指针的有符号整数,与C兼容 intptr_t .
numpy.intp
intptr_t
longlong
有符号整数类型,与C兼容 long long .
long long
'q'
unsignedinteger
所有无符号整数标量类型的抽象基类。
ubyte
无符号整数类型,与C兼容 unsigned char .
unsigned char
'B'
numpy.uint8 :8位无符号整数 (0 到 255 )
numpy.uint8
0
255
ushort
无符号整数类型,与C兼容 unsigned short .
unsigned short
'H'
numpy.uint16 :16位无符号整数 (0 到 65_535 )
numpy.uint16
65_535
uintc
无符号整数类型,与C兼容 unsigned int .
unsigned int
'I'
numpy.uint32 :32位无符号整数 (0 到 4_294_967_295 )
numpy.uint32
4_294_967_295
uint
无符号整数类型,与C兼容 unsigned long .
unsigned long
'L'
numpy.uint64 :64位无符号整数 (0 到 18_446_744_073_709_551_615 )
numpy.uint64
18_446_744_073_709_551_615
numpy.uintp :大到可以容纳指针的无符号整数,与C兼容 uintptr_t .
numpy.uintp
uintptr_t
ulonglong
有符号整数类型,与C兼容 unsigned long long .
unsigned long long
'Q'
inexact
所有数值标量类型的抽象基类,其范围内的值(可能)表示不精确,例如浮点数。
floating
所有浮点标量类型的抽象基类。
half
半精度浮点数类型。
'e'
numpy.float16 :16位精度浮点数类型:符号位、5位指数、10位尾数。
numpy.float16
single
单精度浮点数类型,与C兼容 float .
'f'
numpy.float32 :32位精度浮点数类型:符号位、8位指数、23位尾数。
numpy.float32
double
双精度浮点数类型,与Python兼容 float 和C double .
'd'
numpy.float_
numpy.float64 :64位精度浮点数类型:符号位、11位指数、52位尾数。
numpy.float64
longdouble
扩展精度浮点数类型,与C兼容 long double 但不一定是ieee754四倍精度。
long double
'g'
numpy.longfloat
numpy.float128 :128位扩展精度浮点数类型。
numpy.float128
complexfloating
由浮点数组成的所有复数标量类型的抽象基类。
csingle
由两个单精度浮点数组成的复数类型。
'F'
numpy.singlecomplex
numpy.complex64 :由2个32位精度浮点数组成的复数类型。
numpy.complex64
cdouble
由两个双精度浮点数组成的复数类型,与Python兼容 complex .
'D'
numpy.cfloat
numpy.complex_
numpy.complex128 :由2个64位精度浮点数组成的复数类型。
numpy.complex128
clongdouble
由两个扩展精度浮点数组成的复数类型。
'G'
numpy.clongfloat
numpy.longcomplex
numpy.complex256 :由2个128位扩展精度浮点数组成的复数类型。
numpy.complex256
布尔类型(True或False),存储为字节。
这个 bool_ 类型不是 int_ 类型 bool_ 甚至不是数字类型)。这不同于python的默认实现 bool 作为 int .
'?'
numpy.bool8
存储为64位整数的日期时间,从 1970-01-01T00:00:00 .
1970-01-01T00:00:00
>>> np.datetime64(10, 'Y') numpy.datetime64('1980') >>> np.datetime64(10, 'D') numpy.datetime64('1970-01-11')
见 日期时间和时间增量 更多信息。
'M'
存储为64位整数的时间增量。
'm'
object_
任何Python对象。
'O'
注解
实际存储在对象数组中的数据( i.e. ,具有数据类型的数组 object_ )是对python对象的引用,而不是对象本身。因此,对象数组的行为更像通常的Python lists 从某种意义上说,它们的内容不必是相同的Python类型。
lists
对象类型也是特殊的,因为包含 object_ 项目不返回 object_ 对象,但返回数组项引用的实际对象。
以下数据类型是 灵活的 :它们没有预先定义的大小,它们描述的数据在不同的数组中可以有不同的长度。(在字符代码中 # 是一个整数,表示数据类型由多少个元素组成。)
#
flexible
没有预定义长度的所有标量类型的抽象基类。这些类型的实际大小取决于特定的 np.dtype 实例化。
字节字符串。
在数组中使用时,此类型会剥离尾部的空字节。
'S'
numpy.string_
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_
不透明的字节序列或结构。
>>> 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 -> S1 , b -> B , 1 -> b , s -> h , w -> H 和 u -> I . 这些更改使类型字符约定与其他Python模块(如 struct 模块。
c -> S1
b -> B
1 -> b
s -> h
w -> H
u -> I
struct
除了它们的(大部分)C派生名称之外,integer、float和complex数据类型也可以使用位宽度约定,这样就可以始终确保正确大小的数组。两个别名 (numpy.intp 和 numpy.uintp )指向hold类型的指针C也足够大。
bool8
alias of numpy.bool_
numpy.bool_
int8
int16
int32
int64
有符号整数类型的别名(其中一个 numpy.byte , numpy.short , numpy.intc , numpy.int_ 和 numpy.longlong )具有指定的位数。
numpy.byte
numpy.short
numpy.intc
numpy.int_
numpy.longlong
与C99兼容 int8_t , int16_t , int32_t 和 int64_t ,分别。
int8_t
int16_t
int32_t
int64_t
uint8
uint16
uint32
uint64
无符号整数类型的别名(其中一个 numpy.byte , numpy.short , numpy.intc , numpy.int_ 和 numpy.longlong )具有指定的位数。
与C99兼容 uint8_t , uint16_t , uint32_t 和 uint64_t ,分别。
uint8_t
uint16_t
uint32_t
uint64_t
有符号整数类型的别名(其中一个 numpy.byte , numpy.short , numpy.intc , numpy.int_ 和 np.longlong )与指针大小相同。
与C兼容 intptr_t .
'p'
无符号整数类型的别名(其中一个 numpy.byte , numpy.short , numpy.intc , numpy.int_ 和 np.longlong )与指针大小相同。
与C兼容 uintptr_t .
'P'
float16
alias of numpy.half
numpy.half
float32
alias of numpy.single
numpy.single
float64
alias of numpy.double
numpy.double
float96
float128
Alias numpy.longdouble ,以其大小(位)命名。这些别名的存在取决于平台。
numpy.longdouble
complex64
alias of numpy.csingle
numpy.csingle
complex128
alias of numpy.cdouble
numpy.cdouble
complex192
complex256
Alias numpy.clongdouble ,以其大小(位)命名。这些别名的存在取决于平台。
numpy.clongdouble
前两个是类似于内置类型名称的便利,与 bool_ , int_ , str_ , bytes_ 和 object_ :
还有一些对扩展精度浮点和复数使用替代命名约定:
longfloat
alias of numpy.longdouble
singlecomplex
cfloat
longcomplex
alias of numpy.clongdouble
clongfloat
以下别名源于python2,建议不要在新代码中使用它们。
string_
alias of numpy.bytes_
numpy.bytes_
unicode_
alias of numpy.str_
numpy.str_
数组标量对象具有 array priority 属于 NPY_SCALAR_PRIORITY (-1000000.0)。他们还没有 ctypes 属性。否则,它们与数组共享相同的属性:
array priority
NPY_SCALAR_PRIORITY
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.“数组”从数组返回标量
参见
索引, 数据类型对象 (dtype )
数组标量可以像0维数组一样进行索引:如果 x 是数组标量,
x[()] 返回数组标量的副本
x[()]
x[...] returns a 0-dimensional ndarray
x[...]
x['field-name'] 返回字段中的数组标量 field-name . ( x 例如,当字段对应于结构化数据类型时,可以有字段。)
x['field-name']
数组标量的方法与数组完全相同。这些方法的默认行为是在内部将标量转换为等效的0维数组,并调用相应的数组方法。此外,还定义了数组标量上的数学运算,以便设置相同的硬件标志,并用于解释结果 ufunc 这样,UFUNC所使用的错误状态也将转移到数组标量上的数学。
上述规则的例外情况如下:
generic.__array__
sc.“数组”(dtype)从具有指定dtype的标量返回0-dim数组
generic.squeeze
与对应数组属性相同的标量方法。
generic.byteswap
generic.__reduce__
泡菜助手。
generic.__setstate__
generic.setflags
有两种方法可以有效地定义新的数组标量类型(除了组合结构化类型之外 dtypes 从内置的标量类型):一种方法是简单地将 ndarray 改写感兴趣的方法。这在一定程度上是可行的,但在内部某些行为是由数组的数据类型固定的。要完全自定义数组的数据类型,需要定义一个新的数据类型,并用numpy注册它。此类新类型只能在C中定义,使用 NumPy C-API .