Scalars 标量¶
Python只定义了一种特定的数据类(只有一种整数类型,一种浮点类型等)。在不需要关心数据在计算机中表示的所有方式的应用程序中,这可以很方便。然而,对于科学计算而言,通常需要更多的控制。
在NumPy中,有24种新的基本Python类型来描述不同类型的标量。这些类型描述符大多基于CPython编写的C语言中可用的类型,还有几种与Python类型兼容的其他类型。
数组标量具有与ndarrays
相同的属性和方法。[1] This allows one to treat items of an array partly on the same footing as arrays, smoothing out rough edges that result when mixing scalar and array operations.
数组标量存在于数据类型的层次结构中(参见下图)。例如,isinstance(val, np.generic)
如果val是数组标量对象将返回True
。或者,可以使用数据类型层次结构的其他成员来确定存在哪种类型的数组标量。Thus, for example isinstance(val, np.complexfloating)
will return True
if val is a complex valued type, while isinstance(val, np.flexible)
will return true if val is one of the flexible itemsize array types (string
, unicode
, void
).
[1] T0> | 但是,数组标量是不可变的,因此不能设置数组标量属性。 |
内置标量类型¶
内置的标量类型如下所示。Along with their (mostly) C-derived names, the integer, float, and complex data-types are also available using a bit-width convention so that an array of the right size can always be ensured (e.g. int8
, float64
, complex128
). 还提供了指向足够大以容纳C指针的整数类型的两个别名(intp
和uintp
)。类似C的名称与字符代码相关联,这些代码显示在表中。不鼓励使用字符代码。
一些标量类型基本上等同于基本的Python类型,因此可以从它们以及通用数组标量类型继承它们:
数组标量类型 | 相关的Python类型 |
---|---|
int_ |
IntType (仅限Python 2) |
float_ |
FloatType |
complex_ |
ComplexType |
str_ |
StringType |
unicode_ |
UnicodeType |
bool_
数据类型与Python BooleanType
非常相似,但不会从它继承,因为Python的BooleanType
不允许从它继承,而在C级别上,实际布尔数据的大小与Python布尔标量不同。
警告
bool_
类型不是int_
类型的子类(bool_
甚至不是数字类型)。这与Python的bool
作为int的子类的默认实现不同。
Tip
NumPy中的默认数据类型是float_
。
在下面的表格中,platform?
意味着该类型可能不适用于所有平台。指出了与不同C或Python类型的兼容性:如果数据的大小相同且解释相同,则两种类型兼容。
布尔:
类型 | 备注 | 字符代码 |
---|---|---|
bool_ |
兼容:Python布尔 | '?' |
bool8 |
8位 |
整数:
byte |
兼容:C字符 | 'b' |
short |
兼容:C短 | 'h' |
intc |
兼容:C int | 'i' |
int_ |
兼容:Python int | 'l' |
longlong |
兼容:C长久 | 'q' |
intp |
足够大以适应指针 | 'p' |
int8 |
8位 | |
int16 |
16位 | |
int32 |
32位 | |
int64 |
64位 |
无符号整数:
ubyte |
兼容:C无符号字符 | 'b' |
ushort |
兼容:C无符号短 | 'h' |
uintc |
兼容:C无符号整型 | 'i' |
uint |
兼容:Python int | 'l' |
ulonglong |
兼容:C长久 | 'q' |
uintp |
足够大以适应指针 | 'p' |
uint8 |
8位 | |
uint16 |
16位 | |
uint32 |
32位 | |
uint64 |
64位 |
浮点数字:
half |
'e' |
|
single |
兼容:C浮动 | 'f' |
double |
兼容:C双 | |
float_ |
兼容:Python浮动 | 'd' |
longfloat |
兼容:C长浮标 | 'g' |
float16 |
16位 | |
float32 |
32位 | |
float64 |
64位 | |
float96 |
96位,平台? | |
float128 |
128位,平台? |
复杂的浮点数字:
csingle |
'f' |
|
complex_ |
兼容:Python复杂 | 'd' |
clongfloat |
'g' |
|
complex64 |
两个32位浮点数 | |
complex128 |
两个64位浮点数 | |
complex192 |
两个96位浮点平台? | |
complex256 |
两个128位浮点,平台? |
任何Python对象:
object_ |
任何Python对象 | 'O' |
注意
实际存储在对象数组(即,具有dtype object_
的数组)的数据是对Python对象的引用,而不是对象本身。因此,对象数组的行为更像通常的Python lists
,因为它们的内容不必是相同的Python类型。
对象类型也是特殊的,因为包含object_
项的数组不会返回项访问中的object_
对象,而是返回数组项引用的实际对象。
以下数据类型是灵活的。它们没有预定义的大小:它们描述的数据在不同的阵列中可以有不同的长度。(在字符代码#
是一个整数,表示数据类型由多少个元素组成。)
str_ |
兼容:Python str | 'S#' |
unicode_ |
兼容:Python unicode | 'U#' |
void |
'V#' |
警告
数字兼容性:如果您在数字代码中使用了旧的typecode字符(这是从未推荐的),您需要将其中一些字符改为新字符。In particular, the needed changes are c -> S1
, b -> B
, 1 -> b
, s -> h
, w -> H
, and u -> I
. 这些更改使得类型字符约定与其他Python模块(如struct
模块)更加一致。
属性¶ T0>
数组标量对象具有NPY_SCALAR_PRIORITY
(-1,000,000.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 .__ array_wrap __(obj)从数组返回标量 |
索引¶ T0>
数组标量可以像索引0维数组:如果x是一个数组标量,
x[()]
返回数组标量的一个副本x[...]
返回一个0维的ndarray
x['field-name']
在字段字段名称中返回数组标量。(x可以包含字段,例如,当它对应于结构化数据类型时)。
方法¶ T0>
数组标量具有与数组完全相同的方法。这些方法的默认行为是将标量内部转换为等效的0维数组并调用相应的数组方法。另外,对数组标量的数学运算进行了定义,以便设置相同的硬件标志并将其用于解释ufunc的结果,以便用于ufuncs的错误状态也转移到数学运算上数组标量。
上述规则的例外情况如下:
generic |
numpy标量类型的基类。 |
generic.__array__ |
sc .__ array __(|类型)返回0-dim数组 |
generic.__array_wrap__ |
sc .__ array_wrap __(obj)从数组返回标量 |
generic.squeeze |
未实现(虚拟属性) |
generic.byteswap |
未实现(虚拟属性) |
generic.__reduce__ |
|
generic.__setstate__ |
|
generic.setflags |
未实现(虚拟属性) |
定义新类型¶
有两种方法可以有效地定义新的数组标量类型(除了从内置标量类型构造结构化类型dtypes外):一种方法是简单地将ndarray
并覆盖感兴趣的方法。这将在一定程度上起作用,但内部某些行为是由数组的数据类型固定的。要完全自定义数组的数据类型,您需要定义一个新的数据类型,并将其注册到NumPy。Such new types can only be defined in C, using the NumPy C-API.