2.2 ndarray 的属性


文档摘要

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 字节。

2.2 ndarray 的属性

NumPy ndarray 的属性详解

2.2.1 ndim:维度数量

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

图示:

2.2.2 shape:维度大小

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)

图示:

2.2.3 size:元素总数

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

图示:

2.2.4 dtype:数据类型

dtype 属性返回数组中元素的数据类型。NumPy 数组的所有元素必须是相同类型的。常见的数据类型包括 int32float64bool 等。

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

图示:

2.2.5 itemsize:元素字节大小

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

图示:

2.2.6 data:数据缓冲区

data 属性返回一个指向数组数据起始位置的缓冲区对象。通常不需要直接访问此属性,因为它主要用于 NumPy 内部。

import numpy as np arr = np.array([1, 2, 3]) print(f"arr.data: {arr.data}") # 输出: <memory at 0x...> (内存地址)

图示:

2.2.7 nbytes:总字节大小

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)

图示:

2.2.8 strides:步长

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)

解释:

  • 对于二维数组 arr2dstrides(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)

图示:

2.2.9 flags:数组标志

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 提供的强大功能,从而解决各种科学计算和数据分析问题。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U