2.2 ndarray 的属性 NumPy ndarray 的属性详解 2.2.1 ndim:维度数量 属性返回数组的维度数量(轴的数量)。一维数组的 为 1,二维数组的 为 2,以此类推。 图示: 2.2.2 shape:维度大小 属性返回一个元组,表示数组在每个维度上的大小。例如,一个 的数组有 3 行和 4 列。 图示: 2.2.3 size:元素总数 属性返回数组中元素的总数。它等于 中所有元素的乘积。 图示: 2.2.4 dtype:数据类型 属性返回数组中元素的数据类型。NumPy 数组的所有元素必须是相同类型的。常见的数据类型包括 、 、 等。 图示: 2.2.5 itemsize:元素字节大小 属性返回数组中每个元素的字节大小。例如, 类型的元素的 为 4 字节。
ndim 属性返回数组的维度数量(轴的数量)。一维数组的 ndim 为 1,二维数组的 ndim 为 2,以此类推。
import numpy as np # 一维数组 arr1d = np.array([1, 2, 3]) print(f"arr1d.ndim: {arr1d.ndim}") # 输出: arr1d.ndim: 1 # 二维数组 arr2d = np.array([[1, 2, 3], [4, 5, 6]]) print(f"arr2d.ndim: {arr2d.ndim}") # 输出: arr2d.ndim: 2 # 三维数组 arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(f"arr3d.ndim: {arr3d.ndim}") # 输出: arr3d.ndim: 3
图示:
shape 属性返回一个元组,表示数组在每个维度上的大小。例如,一个 (3, 4) 的数组有 3 行和 4 列。
import numpy as np arr2d = np.array([[1, 2, 3], [4, 5, 6]]) print(f"arr2d.shape: {arr2d.shape}") # 输出: arr2d.shape: (2, 3) arr1d = np.array([1, 2, 3, 4, 5]) print(f"arr1d.shape: {arr1d.shape}") # 输出: arr1d.shape: (5,) arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(f"arr3d.shape: {arr3d.shape}") # 输出: arr3d.shape: (2, 2, 2)
图示:
size 属性返回数组中元素的总数。它等于 shape 中所有元素的乘积。
import numpy as np arr2d = np.array([[1, 2, 3], [4, 5, 6]]) print(f"arr2d.size: {arr2d.size}") # 输出: arr2d.size: 6 arr1d = np.array([1, 2, 3, 4, 5]) print(f"arr1d.size: {arr1d.size}") # 输出: arr1d.size: 5 arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(f"arr3d.size: {arr3d.size}") # 输出: arr3d.size: 8
图示:
dtype 属性返回数组中元素的数据类型。NumPy 数组的所有元素必须是相同类型的。常见的数据类型包括 int32、float64、bool 等。
import numpy as np arr_int = np.array([1, 2, 3]) print(f"arr_int.dtype: {arr_int.dtype}") # 输出: arr_int.dtype: int64 (or int32, depending on system) arr_float = np.array([1.0, 2.0, 3.0]) print(f"arr_float.dtype: {arr_float.dtype}") # 输出: arr_float.dtype: float64 arr_bool = np.array([True, False, True]) print(f"arr_bool.dtype: {arr_bool.dtype}") # 输出: arr_bool.dtype: bool arr_str = np.array(['apple', 'banana', 'cherry']) print(f"arr_str.dtype: {arr_str.dtype}") # 输出: arr_str.dtype: <U6
图示:
itemsize 属性返回数组中每个元素的字节大小。例如,int32 类型的元素的 itemsize 为 4 字节。
import numpy as np arr_int = np.array([1, 2, 3], dtype=np.int32) print(f"arr_int.itemsize: {arr_int.itemsize}") # 输出: arr_int.itemsize: 4 arr_float = np.array([1.0, 2.0, 3.0], dtype=np.float64) print(f"arr_float.itemsize: {arr_float.itemsize}") # 输出: arr_float.itemsize: 8 arr_bool = np.array([True, False, True]) print(f"arr_bool.itemsize: {arr_bool.itemsize}") # 输出: arr_bool.itemsize: 1
图示:
data 属性返回一个指向数组数据起始位置的缓冲区对象。通常不需要直接访问此属性,因为它主要用于 NumPy 内部。
import numpy as np arr = np.array([1, 2, 3]) print(f"arr.data: {arr.data}") # 输出: <memory at 0x...> (内存地址)
图示:
nbytes 属性返回数组中所有元素占用的总字节数。它等于 itemsize * size。
import numpy as np arr_int = np.array([1, 2, 3], dtype=np.int32) print(f"arr_int.nbytes: {arr_int.nbytes}") # 输出: arr_int.nbytes: 12 (3 * 4) arr_float = np.array([1.0, 2.0, 3.0], dtype=np.float64) print(f"arr_float.nbytes: {arr_float.nbytes}") # 输出: arr_float.nbytes: 24 (3 * 8)
图示:
strides 属性返回一个元组,表示在每个维度上移动到下一个元素所需的字节数。对于二维数组,第一个值表示在行上移动到下一个元素所需的字节数,第二个值表示在列上移动到下一个元素所需的字节数。
import numpy as np arr2d = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32) print(f"arr2d.strides: {arr2d.strides}") # 输出: arr2d.strides: (12, 4) (假设是连续内存) arr1d = np.array([1,2,3,4,5], dtype=np.int32) print(f"arr1d.strides: {arr1d.strides}") # 输出: arr1d.strides: (4,) arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]], dtype=np.int32) print(f"arr3d.strides: {arr3d.strides}") # 输出: arr3d.strides: (16, 8, 4)
解释:
对于二维数组 arr2d,strides 是 (12, 4)。这意味着:
要从一个元素移动到同一列的下一行,需要跳过 12 字节(3 个 int32 元素)。
要从一个元素移动到同一行的下一个元素,需要跳过 4 字节(1 个 int32 元素)。
对于一维数组 arr1d, strides 是 (4,)。这意味着移动到下一个元素需要跳过4个字节。
对于三维数组 arr3d, strides 是 (16, 8, 4)。 这意味着:
移动到下一个块,需要跳过16个字节(2*2 * int32)
移动到下一个行,需要跳过8个字节(2 * int32)
移动到下一个元素,需要跳过4个字节(int32)
图示:
flags 属性返回一个对象,包含关于数组内存布局的信息,例如数组是否是 C 连续的、F 连续的、可写的等。
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) print(f"arr.flags: {arr.flags}")
输出可能如下:
C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False
C_CONTIGUOUS: 数据是否以 C 顺序存储(行优先)。
F_CONTIGUOUS: 数据是否以 Fortran 顺序存储(列优先)。
OWNDATA: 数组是否拥有其数据。
WRITEABLE: 数组是否可写。
ALIGNED: 数据在内存中是否正确对齐。
WRITEBACKIFCOPY: 是否需要将副本写回原始数组。
UPDATEIFCOPY: 是否可以更新副本。
图示:
理解 ndarray 的属性对于高效地使用 NumPy 至关重要。这些属性提供了关于数组结构、数据类型和内存布局的关键信息,可以帮助你优化代码并避免潜在的错误。 通过掌握这些属性,可以更好地利用 NumPy 提供的强大功能,从而解决各种科学计算和数据分析问题。