NumPy - Ndarray 对象



NumPy ndarray

NumPy 中定义的最重要的对象是称为ndarray的 N 维数组类型。它描述了一个相同类型项的集合,可以使用基于零的索引访问这些项。

ndarray 中的每个项在内存中占用相同大小的块,并由称为dtype的数据类型对象表示。

从 ndarray 对象(通过切片)提取的任何项都由数组标量类型之一的 Python 对象表示。

ndarray、dtype 和数组标量类型之间的关系

下图显示了ndarray、数据类型对象dtype和数组标量类型之间的关系:

Ndarray

创建 ndarray

可以使用不同的数组创建例程构造 ndarray 类的实例。基本的 ndarray 使用 NumPy 中的array()函数创建。

numpy.array()函数从公开数组接口的任何对象或从返回数组的任何方法创建 ndarray。以下是语法:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

上述构造函数采用以下参数:

序号 参数和描述
1

object

任何公开数组接口方法并返回数组的对象,或任何(嵌套的)序列。

2

dtype

所需的数组数据类型,可选

3

copy

可选。默认情况下(true),对象会被复制

4

order

C(行主序)或 F(列主序)或 A(任意)(默认)

5

subok

默认情况下,返回的数组强制为基类数组。如果为 true,则子类将被传递

6

ndmin

指定结果数组的最小维度

请查看以下示例以更好地理解。

示例:创建一维数组

在以下示例中,我们使用 NumPy 中的 array() 函数创建了一个一维数组:

import numpy as np
a = np.array([1, 2, 3])
print(a)

获得的输出如下:

[1, 2, 3]

示例:创建多维数组

在这里,我们使用 NumPy 中的 array() 函数创建了一个二维数组:

import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)

这将产生以下结果:

[[1 2]
 [3 4]]

示例:指定最小维度

现在,我们通过将“ndmin”作为参数传递给 array() 函数来指定结果数组的最小维度:

import numpy as np
a = np.array([1, 2, 3, 4, 5], ndmin=2)
print(a)

以下是上述代码的输出:

[[1 2 3 4 5]]

示例:指定数据类型

在下面的示例中,我们将 array() 函数中的“dtype”参数设置为 complex:

import numpy as np
a = np.array([1, 2, 3], dtype=complex)
print(a)

执行上述代码后,我们得到以下输出:

[1.+0.j 2.+0.j 3.+0.j]

ndarray 的内存布局

一个ndarray对象由一个连续的内存块组成。这意味着数组中的所有元素都存储在内存的单个连续段中。这种连续的内存布局允许轻松访问和操作数组元素。

索引方案

索引方案将 ndarray 中的每个项映射到内存块中的特定位置。ndarray 使用形状和步长的组合来确定每个元素的位置。

  • 形状 - 数组的形状是一个整数元组,表示数组沿每个维度的尺寸。例如,2x3 数组的形状为 (2, 3)。

  • 步长 - 步长是在遍历数组时每个维度需要跳过的字节数。步长决定如何在每个维度上从一个元素移动到下一个元素。

行主序和列主序

ndarray 中的元素可以以两种主要顺序存储。它们是:

  • 行主序(C 样式) - 在行主序中,最后一个索引变化最快。这意味着同一行中的元素在内存中彼此相邻存储。NumPy 默认使用行主序。例如,在 2x3 数组中:

    [[1, 2, 3],
     [4, 5, 6]]
    

    元素在内存中存储为:1、2、3、4、5、6。

  • 列主序(FORTRAN 样式) - 在列主序中,第一个索引变化最快。这意味着同一列中的元素在内存中彼此相邻存储。例如,在 2x3 数组中:

    [[1, 2, 3],
     [4, 5, 6]]
    

    元素在内存中存储为:1、4、2、5、3、6。

示例

以下是一个基本示例,演示了内存布局的使用:

import numpy as np

# Creating a 2x3 array in row-major order
a = np.array([[1, 2, 3], [4, 5, 6]])
print("Array:")
print(a)
print("Shape:", a.shape)
print("Strides:", a.strides)

数组的形状为 (2, 3),表示它有 2 行 3 列。步长为 (24, 8),这意味着要移动到下一行,我们需要跳过 24 个字节(因为每个元素都是一个 8 字节整数,并且有 3 列),要移动到下一列,我们需要跳过 8 个字节(一个整数的大小),如以下输出所示:

Array:
[[1 2 3]
 [4 5 6]]
Shape: (2, 3)
Strides: (24, 8)
广告