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).

../_images/dtype-hierarchy.png

Figure: Hierarchy of type objects representing the array data types. Not shown are the two integer types intp and uintp which just point to the integer type that holds a pointer for the platform. All the number types can be obtained using bit-width names as well.

[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指针的整数类型的两个别名(intpuintp)。类似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的子类的默认实现不同。

警告

由于类型int不再是int_类型,所以不是继承自Python 3中内置的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.