N 维数组 ( ndarray )#
An ndarray is a (usually fixed-size) multidimensional
container of items of the same type and size. The number of dimensions
and items in an array is defined by its shape,
which is a tuple of N non-negative integers that specify the
sizes of each dimension. The type of items in the array is specified by
a separate data-type object (dtype), one of which
is associated with each ndarray.
与 Python 中的其他容器对象一样,可以通过 ndarray 数组(例如,使用 N 个整数)以及通过 indexing or slicing 的方法和属性来访问和修改 ndarray 的内容.
Different ndarrays can share the same data, so that
changes made in one ndarray may be visible in another. That
is, an ndarray can be a “view” to another ndarray, and the data it
is referring to is taken care of by the “base” ndarray. ndarrays can
also be views to memory owned by Python strings or
objects implementing the memoryview or array interfaces.
示例
一个大小为 2 x 3 的二维数组,由 4 字节整数元素组成:
>>> import numpy as np
>>> x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
>>> type(x)
<class 'numpy.ndarray'>
>>> x.shape
(2, 3)
>>> x.dtype
dtype('int32')
可以使用类似 Python 容器的语法对数组进行索引:
>>> # The element of x in the *second* row, *third* column, namely, 6.
>>> x[1, 2]
6
例如, slicing 可以生成数组的视图:
>>> y = x[:,1]
>>> y
array([2, 5], dtype=int32)
>>> y[0] = 9 # this also changes the corresponding element in x
>>> y
array([9, 5], dtype=int32)
>>> x
array([[1, 9, 3],
[4, 5, 6]], dtype=int32)
构造数组#
可以使用 数组创建例程 中详述的例程以及使用低级 ndarray 构造函数来构造新数组:
|
数组对象表示固定大小项目的多维,同构数组. |
索引数组#
可以使用扩展的 Python 切片语法 array[selection] 来索引数组. 类似的语法也用于访问 structured data type 中的字段.
参见
ndarray 的内部内存布局#
ndarray 类的实例由计算机内存中连续的一维段(由数组或某些其他对象拥有)组成,并结合将 N 个整数映射到块中项目位置的索引方案.索引可以在其中变化的范围由数组的 shape 指定.每个项目占用多少字节以及如何解释字节由与数组关联的 data-type object 定义.
内存段本质上是一维的,并且有许多不同的方案用于在 一维块中排列 N 维数组的项目.NumPy 非常灵活,并且 ndarray 对象可以容纳任何跨步索引方案.在跨步方案中,N 维索引 \((n_0, n_1, ..., n_{N-1})\) 对应于偏移量(以字节为单位):
从与数组关联的内存块的开头开始.这里, \(s_k\) 是指定数组 strides 的整数. column-major 顺序(例如,在 Fortran 语言和 Matlab 中使用)和 row-major 顺序(在 C 中使用)方案只是跨步方案的特定种类,并且对应于可以通过步幅寻址的内存:
其中 \(d_j\) = self.shape[j] .
C 顺序和 Fortran 顺序都是 contiguous ,即单段内存布局,其中内存块的每个部分都可以通过索引的某种组合来访问.
备注
连续数组和单段数组是同义词,并在整个文档中互换使用.
虽然具有相应标志集的 C 风格和 Fortran 风格的连续数组可以使用上述步幅进行寻址,但实际步幅可能不同.这可能发生在两种情况下:
如果
self.shape[k] == 1,则对于任何合法的索引index[k] == 0.这意味着在偏移量公式中 \(n_k = 0\) ,因此 \(s_k n_k = 0\) ,并且 \(s_k\) = self.strides[k] 的值是任意的.如果数组没有元素 (
self.size == 0),则没有合法的索引,并且永远不会使用步幅.任何没有元素的数组都可以被认为是 C 风格和 Fortran 风格的连续数组.
第 1 点意味着 self 和 self.squeeze() 始终具有相同的连续性和 aligned 标志值.这也意味着即使是高维数组也可以同时是 C 风格和 Fortran 风格的连续数组.
如果所有元素的内存偏移量和基本偏移量本身都是 self.itemsize 的倍数,则认为数组已对齐. 了解内存对齐可以提高大多数硬件的性能.
警告
对于 C 风格的连续数组,通常 self.strides[-1] == self.itemsize 不成立;对于 Fortran 风格的连续数组, self.strides[0] == self.itemsize 也不成立.
除非另有说明,否则新的 ndarrays 中的数据是 row-major (C) 顺序,但是,例如, basic array slicing 通常以不同的方案生成 views .
备注
NumPy 中的几种算法适用于任意步幅的数组.但是,某些算法需要单段数组.当将不规则步幅数组传递给此类算法时,会自动创建一个副本.
数组属性#
数组属性反映了数组本身固有的信息.通常,通过其属性访问数组允许您获取并有时设置数组的固有属性,而无需创建新数组.公开的属性是数组的核心部分,只有其中一些属性可以在不创建新数组的情况下有意义地重置.下面给出了有关每个属性的信息.
内存布局#
以下属性包含有关数组内存布局的信息:
关于数组内存布局的信息. |
|
数组维度的元组. |
|
遍历数组时,在每个维度中步进的字节数的元组. |
|
数组维度的数量. |
|
指向数组数据起点的 Python 缓冲区对象. |
|
数组中元素的数量. |
|
一个数组元素以字节为单位的长度. |
|
数组元素占用的总字节数. |
|
如果内存来自其他对象,则为基对象. |
数据类型#
与数组关联的数据类型对象可以在 dtype 属性中找到:
数组元素的数据类型. |
其他属性#
转置数组的视图. |
|
数组的实部. |
|
数组的虚部. |
|
一个在数组上进行 1-D 迭代的迭代器. |
数组接口#
参见
数组接口协议 .
数组接口的 Python 端 |
|
数组接口的 C 端 |
ctypes 外部函数接口#
一个简化数组与 ctypes 模块交互的对象. |
数组方法#
ndarray 对象有许多方法可以以某种方式对数组进行操作,通常返回数组结果.下面简要解释这些方法.(每个方法的文档字符串都有更完整的描述.)
对于以下方法, numpy 中也有相应的函数 all , any , argmax , argmin , argpartition , argsort , choose , clip , compress , copy , cumprod , cumsum , diagonal , imag , max , mean , min , nonzero , partition , prod , put , ravel , real , repeat , reshape , round , searchsorted , sort , squeeze , std , sum , swapaxes , take , trace , transpose , var .
数组转换#
|
将数组的元素复制到标准 Python 标量并返回. |
将数组作为 |
|
|
构造包含数组中原始数据字节的 Python 字节. |
|
将数组作为文本或二进制(默认)写入文件. |
|
将数组的 pickle 转储到指定的文件. |
将数组的 pickle 作为字符串返回. |
|
|
数组的副本,转换为指定的类型. |
|
交换数组元素的字节 |
|
返回数组的副本. |
|
具有相同数据的数组的新视图. |
|
将给定数组的字段作为某种类型返回. |
|
分别设置数组标志 WRITEABLE,ALIGNED,WRITEBACKIFCOPY. |
|
用标量值填充数组. |
形状操作#
对于 reshape,resize 和 transpose,单个元组参数可以替换为 n 个整数,这些整数将被解释为一个 n 元组.
|
返回一个包含相同数据但具有新形状的数组. |
|
就地更改数组的形状和大小. |
|
返回一个轴已转置的数组视图. |
|
返回一个 axis1 和 axis2 互换的数组视图. |
|
返回一个折叠成一维的数组的副本. |
|
返回一个扁平化数组. |
|
从 a 中移除长度为 1 的轴. |
条目选择和操作#
对于采用 axis 关键字的数组方法,它默认为 None.如果 axis 为 None,则数组被视为一维数组.axis 的任何其他值表示操作应沿其进行的维度.
|
返回一个由给定索引处的 a 的元素组成的数组. |
|
对于 indices 中的所有 n ,设置 |
|
重复数组的元素. |
|
使用索引数组从一组选择构造一个新数组. |
|
就地对数组进行排序. |
|
返回将对该数组进行排序的索引. |
|
以某种方式部分地对数组中的元素进行排序,使得第 k 个位置的元素的值位于已排序数组中的位置. |
|
返回将对该数组进行分区的索引. |
|
找到应将 v 的元素插入 a 中的索引以保持顺序. |
返回非零元素的索引. |
|
|
返回沿给定轴的此数组的选定切片. |
|
返回指定的对角线. |
计算#
其中许多方法采用名为 axis 的参数.在这些情况下,
如果 axis 为 None(默认值),则数组被视为一维数组,并且操作在整个数组上执行.如果 self 是 0 维数组或数组标量,则此行为也是默认行为.(数组标量是 float32,float64 等类型/类的实例,而 0 维数组是包含精确一个数组标量的 ndarray 实例.)
如果 axis 是一个整数,则操作在给定的轴上完成(对于可以沿给定轴创建的每个一维子数组).
axis 参数的示例
大小为 3 x 3 x 3 的 3 维数组,对其三个轴中的每一个求和:
>>> import numpy as np
>>> x = np.arange(27).reshape((3,3,3))
>>> x
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>> x.sum(axis=0)
array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]])
>>> # for sum, axis is the first keyword, so we may omit it,
>>> # specifying only its value
>>> x.sum(0), x.sum(1), x.sum(2)
(array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]]),
array([[ 9, 12, 15],
[36, 39, 42],
[63, 66, 69]]),
array([[ 3, 12, 21],
[30, 39, 48],
[57, 66, 75]]))
参数 dtype 指定应该在其上进行归约运算(如求和)的数据类型.默认的归约数据类型与 self 的数据类型相同.为了避免溢出,使用更大的数据类型执行归约可能很有用.
对于几种方法,还可以提供一个可选的 out 参数,结果将放入给定的输出数组中.out 参数必须是 ndarray 并且具有相同数量的元素.它可以具有不同的数据类型,在这种情况下将执行强制转换.
|
返回沿给定轴的最大值. |
|
返回沿给定轴的最大值的索引. |
|
返回沿给定轴的最小值. |
|
返回沿给定轴的最小值的索引. |
|
返回一个数组,其值限制在 |
|
对所有元素进行复共轭. |
|
返回 a ,其中每个元素都四舍五入到给定的小数位数. |
|
返回数组沿对角线的和. |
|
返回给定轴上数组元素的总和. |
|
返回沿给定轴的元素的累积和. |
|
返回沿给定轴的数组元素的平均值. |
|
返回给定轴上数组元素的方差. |
|
返回给定轴上数组元素的标准差. |
|
返回给定轴上数组元素的乘积. |
|
返回沿给定轴的元素的累积乘积. |
|
如果所有元素的计算结果都为 True,则返回 True. |
|
如果 a 的任何元素的计算结果为 True,则返回 True. |
算术,矩阵乘法和比较运算#
在 ndarrays 上的算术和比较运算被定义为元素级的运算,通常会产生 ndarray 对象作为结果.
每个算术运算( + , - , * , / , // , % , divmod() , ** 或 pow() , << , >> , & , ^ , | , ~ )和比较运算( == , < , > , <= , >= , != )等价于 NumPy 中对应的通用函数(或简称为 ufunc ).更多信息请参见 Universal Functions 一节.
比较运算符:
|
返回自身<value. |
|
返回 self<=value. |
|
返回 self>value. |
|
返回 self>=value. |
|
返回 self==value. |
|
返回 self!=value. |
数组的真值 ( bool() ):
|
如果 self 为真,则返回 True,否则返回 False. |
备注
数组的真值测试会调用 ndarray.__bool__ ,如果数组中的元素数量不是 1,则会引发错误,因为此类数组的真值是不明确的.请使用 .any() 和 .all() 来明确在这种情况下意味着什么.(如果您希望检查数组是否为空, 例如使用 .size > 0 .)
一元运算:
|
-self |
|
+self |
|
|
~self |
算术运算:
|
返回 self+value. |
|
返回 self-value. |
|
返回 selfvalue. |
|
返回 self/value. |
|
返回 self//value. |
|
返回 self%value. |
|
返回 divmod(self, value). |
|
返回 pow(self, value, mod). |
|
返回 self<<value. |
|
返回 self>>value. |
|
返回 self&value. |
|
返回 self|value. |
|
返回 self^value. |
备注
因为
ndarray是一个内置类型(用 C 编写),所以__r{op}__特殊方法没有被直接定义.用于实现数组的许多算术特殊方法的函数可以使用
__array_ufunc__来修改.
算术运算,原地:
|
返回 self+=value. |
|
返回 self-=value. |
|
返回 self=value. |
|
返回 self/=value. |
|
返回 self//=value. |
|
返回 self%=value. |
|
返回 self=value. |
|
返回 self<<=value. |
|
返回 self>>=value. |
|
返回 self&=value. |
|
返回 self|=value. |
|
返回 self^=value. |
警告
原地操作将使用由两个操作数的数据类型决定的精度执行计算,但会默默地将结果向下转换(如果需要),以便它可以放回到数组中.因此,对于混合精度计算, A {op}= B 可能与 A = A {op} B 不同.例如,假设 a = ones((3,3)) .然后, a += 3j 与 a = a + 3j 不同:虽然它们都执行相同的计算,但 a += 3 将结果强制转换为适合 a ,而 a = a + 3j 将名称 a 重新绑定到结果.
矩阵乘法:
|
返回 self@value. |
特殊方法#
对于标准库函数:
如果对数组调用 |
|
|
如果对数组调用 |
用于 pickle. |
|
|
用于 unpickle. |
基本定制:
|
|
|
对于 |
|
返回一个与自身类型相同的 |
容器自定义:(参见 Indexing )
|
返回 len(self). |
|
返回 self[key]. |
|
将 self[key] 设置为 value. |
|
返回 bool(key in self). |
转换;操作 int() , float() 和 complex() . 它们仅适用于其中只有一个元素的数组,并返回适当的标量.
|
|
|
|
字符串表示:
|
返回 str(self). |
|
返回 repr(self). |
用于类型的实用程序方法:
|
返回围绕 |