术语表

(n ,)

带圆括号的数字后跟逗号表示一个元组有一个元素。后面的逗号将单元素元组与带圆括号的元组区分开来 n .

-1
  • 在维度条目中 ,指示NumPy选择使数组元素总数保持不变的长度。

    >>> np.arange(12).reshape(4, -1).shape
    (4, 3)
    
  • 在索引中 ,任何负值 denotes 从右边索引。

. . .

Ellipsis .

  • 索引数组时 ,即缺少的轴(如果存在)是完整的切片。

    >>> a = np.arange(24).reshape(2,3,4)
    
    >>> a[...].shape
    (2, 3, 4)
    
    >>> a[...,0].shape
    (2, 3)
    
    >>> a[0,...].shape
    (3, 4)
    
    >>> a[0,...,0].shape
    (3,)
    

    最多只能使用一次; a[...,0,...] 提出一个 IndexError .

  • 在打印输出中 ,NumPy替代品 ... 对于大型数组的中间元素。要查看整个阵列,请使用 numpy.printoptions

Python slice 接线员。在ndarrays中,切片可以应用于每个轴:

>>> a = np.arange(24).reshape(2,3,4)
>>> a
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]]])

>>> a[1:,-2:,:-1]
array([[[16, 17, 18],
        [20, 21, 22]]])

尾部切片可以省略::

>>> a[1] == a[1,:,:]
array([[ True,  True,  True,  True],
       [ True,  True,  True,  True],
       [ True,  True,  True,  True]])

与Python不同,在Python中,切片创建副本,而在NumPy中,切片创建副本 view .

有关详细信息,请参阅 高级索引和基本索引相结合 .

<

在数据类型声明中,指示数据 little-endian (右边的支架很大)。:

>>> dt = np.dtype('<f')  # little-endian single-precision float
>

在数据类型声明中,指示数据 big-endian (左边的支架很大)。:

>>> dt = np.dtype('>H')  # big-endian unsigned short
高级索引

而不是使用 scalar 或切片作为索引,可以使用数组索引轴,从而提供细粒度的选择。这被称为 advanced indexing 或者“花哨的索引”。

沿着轴线

手术 along axis n 数组的 a 其行为就像它的参数是 a 其中每个切片都有一个连续的轴索引 n .

例如,如果 a 是3X N 数组中,沿轴0的操作的行为就像其参数是包含每行切片的数组一样:

>>> np.array((a[0,:], a[1,:], a[2,:])) 

具体来说,我们可以选择数组反转函数作为操作 numpy.flip ,它接受 axis 争论。我们构造了一个3x4阵列 a

>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

沿轴0(行轴)反转产生

>>> np.flip(a,axis=0)
array([[ 8,  9, 10, 11],
       [ 4,  5,  6,  7],
       [ 0,  1,  2,  3]])

回顾 along an axisflip 沿着轴0,将其参数视为

>>> np.array((a[0,:], a[1,:], a[2,:]))
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

以及 np.flip(a,axis=0) 是反转切片:

>>> np.array((a[2,:],a[1,:],a[0,:]))
array([[ 8,  9, 10, 11],
       [ 4,  5,  6,  7],
       [ 0,  1,  2,  3]])
数组

在NumPy文档中同义使用 ndarray .

array_like

任何 scalarsequence 这可以解释为一种混乱。除了ndarray和scalars之外,这个类别还包括列表(可能是嵌套的,并且具有不同的元素类型)和元组。任何被接受的论点 numpy.array 是你喜欢的。:

>>> a = np.array([[1, 2.0], [0, 0], (1+1j, 3.)])

>>> a
array([[1.+0.j, 2.+0.j],
       [0.+0.j, 0.+0.j],
       [1.+1.j, 3.+0.j]])
数组标量

为了处理操作数的一致性,NumPy将 scalar 作为零维数组。

数组维度的另一个术语。轴从左到右编号;轴0是形状元组中的第一个元素。

在二维向量中,轴0的元素是行,轴1的元素是列。

在更高的维度中,情况会发生变化。NumPy打印高维向量作为逐行逐列构建块的复制,如以下三维向量:

>>> a = np.arange(12).reshape(2,2,3)
>>> a
array([[[ 0,  1,  2],
        [ 3,  4,  5]],
       [[ 6,  7,  8],
        [ 9, 10, 11]]])

a 表示为两元素数组,其元素为2x3向量。从这个角度看,行和列分别是任意形状的最后两个轴。

此规则有助于您预测如何打印向量,反之,也有助于找到任何打印元素的索引。例如,在本例中,8的索引的最后两个值必须是0和2。由于8出现在两个2x3的第二个索引中,因此第一个索引必须为1:

>>> a[1,0,2]
8

计算打印向量中的维数的一种方便方法是计算 [ 括号后面的符号。这有助于区分(1,2,3)形状和(2,3)形状:

>>> a = np.arange(6).reshape(2,3)
>>> a.ndim
2
>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> a = np.arange(6).reshape(1,2,3)
>>> a.ndim
3
>>> a
array([[[0, 1, 2],
        [3, 4, 5]]])
.底座

如果一个数组不拥有它的内存,那么它的 base 属性返回数组正在引用其内存的对象。该对象可能正在引用另一个对象的内存,因此拥有的对象可能是 a.base.base.base... . 一些作者错误地宣称测试 base 确定数组是否为 view 有关正确的方法,请参阅 numpy.shares_memory .

大字节

Endianness .

BLAS

Basic Linear Algebra Subprograms

广播

广播 是NumPy处理不同大小数组的能力,就好像所有数组的大小都一样。

对于每个标量元素,我的意思是,给它加一个标量值。

>>> a = np.arange(3)
>>> a
array([0, 1, 2])
>>> a + [3, 3, 3]
array([3, 4, 5])
>>> a + 3
array([3, 4, 5])

通常,向量操作数的大小都必须相同,因为NumPy逐个元素工作——例如, c = a * b 是::

 c[0,0,0] = a[0,0,0] * b[0,0,0]
 c[0,0,1] = a[0,0,1] * b[0,0,1]
...

但在某些有用的情况下,NumPy可以沿“缺失”轴或“太短”尺寸复制数据,以便形状匹配。复制不需要内存和时间。有关详细信息,请参阅 Broadcasting.

C级

等同于 row-major .

列专业

Row- and column-major order .

邻接的
数组是连续的,如果
  • 它占用了一个完整的内存块

  • 索引越高的数组元素占用的地址越高(即没有 stride 是否定的)。

复制

view .

axis .

D型

描述数据数组中(类型相同)元素的数据类型。可以更改它以重新解释数组内容。有关详细信息,请参阅 Data type objects (dtype).

花式索引

另一个术语 advanced indexing .

领域

在一个 structured data type ,每个子类型称为 field . 这个 field 具有名称(字符串)、类型(任何有效的数据类型)和可选的 title . 见 数据类型对象 (dtype ) .

FORTRAN指令

等同于 column-major .

扁平的

ravel .

同种类的

同构数组的所有元素都具有相同的类型。与Python列表相比,ndarray是同质的。类型可能很复杂,例如 structured array ,但所有元素都具有该类型。

NumPy object arrays ,它包含对Python对象的引用,填补了异构数组的角色。

项目尺寸

数据类型元素的大小(以字节为单位)。

小字节

Endianness .

面具

一种布尔数组,用于仅为操作选择某些元素:

>>> x = np.arange(5)
>>> x
array([0, 1, 2, 3, 4])
>>> mask = (x > 2)
>>> mask
array([False, False, False, True,  True])
>>> x[mask] = -1
>>> x
array([ 0,  1,  2,  -1, -1])
屏蔽阵列

将错误或丢失的数据放在一个屏蔽数组中可以完全忽略,该数组有一个内部布尔数组,指示无效的条目。使用屏蔽数组的操作将忽略这些条目。:

>>> a = np.ma.masked_array([np.nan, 2, np.nan], [True, False, True])
>>> a
masked_array(data=[--, 2.0, --],
             mask=[ True, False,  True],
       fill_value=1e+20)

>>> a + [1, 2, 3]
masked_array(data=[--, 4.0, --],
             mask=[ True, False,  True],
       fill_value=1e+20)

有关详细信息,请参阅 Masked arrays.

矩阵

NumPy 二维 matrix class 不应再使用;请使用常规数组。

恩达雷

NumPy's basic structure .

对象数组

数据类型为的数组 object ;也就是说,它包含对Python对象的引用。对数组进行索引会取消对Python对象的引用,因此与其他ndarray不同,对象数组具有容纳异构对象的能力。

拉威尔

numpy.ravel numpy.flatten 两个都使一条线变平。 ravel 如果可能,将返回视图; flatten 总是返回一个副本。

展平将多维数组折叠为单个维度;有关如何执行此操作的详细信息(例如,是否 a[n+1] 应该是下一行或下一列)是参数。

记录数组

A structured array 允许在属性样式中访问 (a.field )除了 a['field'] . 有关详细信息,请参阅 numpy.recarray.

行专业

Row- and column-major order . 默认情况下,NumPy按行主顺序创建数组。

标量

在同义词中,通常是NumPy array scalar .

形状

一个元组,显示数组中每个维度的长度。元组本身的长度就是维数 (numpy.ndim ). 元组元素的乘积是数组中元素的数目。有关详细信息,请参阅 numpy.ndarray.shape .

步幅

物理内存是一维的;跨步提供了一种机制,可以将给定的索引映射到内存中的地址。对于N维数组,其 strides 属性是一个N元素元组;从索引前进 i 到索引 i+1 在轴上 n 意味着增加 a.strides[n] 字节到地址。

步长是根据数组的数据类型和形状自动计算的,但是可以使用 as_strided.

有关详细信息,请参阅 numpy.ndarray.strides .

要了解跨越是如何影响NumPy视图的力量的,请参阅 The NumPy array: a structure for efficient numerical computation.

结构化阵列

数组谁的 dtype 是一个 structured data type .

结构化数据类型

用户可以创建任意复杂的 dtypes 可以包括其他数组和数据类型。这些复合数据类型称为 structured data types.

子阵

嵌套在数组中的数组 structured data type 作为 b 在这里:

>>> dt = np.dtype([('a', np.int32), ('b', np.float32, (3,))])
>>> np.zeros(3, dtype=dt)
array([(0, [0., 0., 0.]), (0, [0., 0., 0.]), (0, [0., 0., 0.])],
      dtype=[('a', '<i4'), ('b', '<f4', (3,))])
子数组数据类型

结构化数据类型的一种元素,其行为类似于数据数组。

标题

结构化数据类型中字段名的别名。

类型

在同义词中,通常是NumPy dtype . 对于更一般的Python含义, see here.

ufunc

NumPy的快速逐元素计算 (vectorization )提供应用哪个函数的选择。函数的通称是 ufunc ,简称 universal function . NumPy例程有内置的ufunc,但是用户也可以 write their own.

矢量化

NumPy将数组处理交给C,在C中循环和计算比Python快得多。为了利用这一点,使用NumPy的程序员消除了Python循环,转而支持数组到数组的操作。 vectorization 可以参考C卸载和构造NumPy代码来利用它。

看法

在不接触底层数据的情况下,NumPy可以使一个数组看起来改变其数据类型和形状。

以这种方式创建的数组是 view ,并且NumPy经常利用使用视图而不是创建新数组的性能优势。

一个潜在的缺点是,写入视图也会改变原始视图。如果这是一个问题,NumPy需要创建一个物理上不同的数组 copy .

有些NumPy例程总是返回视图,有些总是返回副本,有些可能返回其中一个,有些可以指定选项。管理视图和副本的责任属于程序员。 numpy.shares_memory 将检查 b 是一个 a ,但正如文档页面所解释的,准确的答案并不总是可行的。

>>> x = np.arange(5)
>>> x
array([0, 1, 2, 3, 4])
>>> y = x[::2]
>>> y
array([0, 2, 4])
>>> x[0] = 3 # changing x changes y as well, since y is a view on x
>>> y
array([3, 2, 4])