Python 数据科学与可视化工具箱 (一) - 数组创建:array(), arange(), zeros(), ones(), linspace()
文章目录
-
-
- 1. 为什么需要 NumPy 数组创建函数?
- 2. 核心数组创建函数详解
-
- 2.1 `np.array()`:从现有数据创建数组
- 2.2 `np.arange()`:创建等差序列
- 2.3 `np.zeros()`:创建全零数组
- 2.4 `np.ones()`:创建全一数组
- 2.5 `np.linspace()`:创建等间隔序列
- 3. 其他常用数组创建函数 (简要提及)
- 总结
- 练习题
- 练习题答案
-
创作不易,请各位看官顺手点点关注,不胜感激 。
在数据科学领域,NumPy (Numerical Python) 无疑是最核心的库之一。它为我们提供了高效处理大型多维数组的能力,而数组的创建是所有操作的起点。本篇将详细介绍 NumPy 中最常用的几个数组创建函数:np.array()
, np.arange()
, np.zeros()
, np.ones()
, 和 np.linspace()
。理解这些函数能让你游刃有余地构建各种所需的数值数组。
1. 为什么需要 NumPy 数组创建函数?
在前面我们已经提到了 Python 列表在处理大量数值数据时的局限性。NumPy 的核心是其 ndarray
对象,它是一个多维的、同质的、高效的数据容器。为了充分利用 ndarray
的优势,我们需要专门的函数来创建它们。这些函数不仅能快速初始化数组,还能在创建时指定数据类型、形状等重要属性,从而满足不同的计算需求。
2. 核心数组创建函数详解
我们将逐一介绍这些基本且重要的数组创建函数。
2.1 np.array()
:从现有数据创建数组
np.array()
是最通用、最灵活的数组创建函数。它允许你从 Python 的列表、元组或其他序列类型数据中创建 ndarray
。
- 功能: 将输入数据转换为
ndarray
。 - 常用参数:
object
: 任何暴露数组接口的对象、或任何序列。dtype
: 可选参数,指定数组元素的数据类型。如果未指定,NumPy 会自动推断最合适的数据类型。copy
: 可选参数,布尔值。如果为True
(默认),则总是复制输入数据;如果为False
,则仅在输入不是ndarray
时复制,否则尝试返回视图。
示例与说明:
import numpy as np# 从列表创建一维数组list1 = [1, 2, 3, 4, 5]arr1d = np.array(list1)print(\"一维数组 (来自列表):\", arr1d)print(\"类型:\", type(arr1d), \"Dtype:\", arr1d.dtype)# 从元组创建一维数组tuple1 = (6, 7, 8)arr1d_from_tuple = np.array(tuple1)print(\"一维数组 (来自元组):\", arr1d_from_tuple)# 从嵌套列表创建二维数组 (矩阵)list2d = [[10, 11, 12], [13, 14, 15]]arr2d = np.array(list2d)print(\"\\n二维数组 (来自嵌套列表):\\n\", arr2d)print(\"形状:\", arr2d.shape, \"Dtype:\", arr2d.dtype)# 创建时指定数据类型arr_float = np.array([1, 2, 3], dtype=np.float64) # 强制为 float64print(\"\\n指定 float64 类型数组:\", arr_float)print(\"Dtype:\", arr_float.dtype)arr_bool = np.array([0, 1, 0, 100], dtype=np.bool_) # 0 为 False,非 0 为 Trueprint(\"指定 bool 类型数组:\", arr_bool)print(\"Dtype:\", arr_bool.dtype)# 创建三维数组list3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]arr3d = np.array(list3d)print(\"\\n三维数组:\\n\", arr3d)print(\"形状:\", arr3d.shape)
何时使用 np.array()
?
当你已经有现成的 Python 列表、元组或其他可迭代对象,并希望将其转换为 NumPy 数组以便进行高效的数值计算时,np.array()
是首选。
2.2 np.arange()
:创建等差序列
np.arange()
函数类似于 Python 内置的 range()
函数,但它返回的是一个 ndarray
对象,而不是一个迭代器。
- 功能: 返回一个在指定间隔内均匀间隔的数值序列。
- 常用参数:
start
: 可选参数,序列的起始值(包含)。默认为 0。stop
: 序列的终止值(不包含)。step
: 可选参数,序列中数值之间的步长。默认为 1。dtype
: 可选参数,指定结果数组的数据类型。
示例与说明:
# 从 0 到 10 (不包含 10),步长为 1arr_range1 = np.arange(10)print(\"\\narange(10):\", arr_range1)# 从 1 到 10 (不包含 10),步长为 2arr_range2 = np.arange(1, 10, 2)print(\"arange(1, 10, 2):\", arr_range2)# 负数步长,实现倒序arr_range_rev = np.arange(10, 0, -1)print(\"arange(10, 0, -1):\", arr_range_rev)# 浮点数步长arr_range_float = np.arange(0.0, 5.0, 0.5)print(\"arange(0.0, 5.0, 0.5):\", arr_range_float)print(\"Dtype:\", arr_range_float.dtype) # 自动推断为 float64# 指定 dtypearr_range_int8 = np.arange(5, dtype=np.int8)print(\"arange(5, dtype=np.int8):\", arr_range_int8)print(\"Dtype:\", arr_range_int8.dtype)
何时使用 np.arange()
?
当你需要创建一个具有固定步长、数值呈等差数列分布的数组时,np.arange()
是理想选择。常用于生成索引、时间序列或简单的数值范围。
2.3 np.zeros()
:创建全零数组
np.zeros()
函数用于创建一个指定形状的全零数组。
- 功能: 返回一个由零填充的
ndarray
。 - 常用参数:
shape
: 整数或整数元组,定义数组的形状(维度)。dtype
: 可选参数,指定数组元素的数据类型。默认为float64
。
示例与说明:
# 创建一个 3 个元素的一维全零数组zeros_1d = np.zeros(3)print(\"\\nzeros(3):\\n\", zeros_1d)print(\"Dtype:\", zeros_1d.dtype) # 默认 float64# 创建一个 2x3 的二维全零数组zeros_2d = np.zeros((2, 3))print(\"\\nzeros((2, 3)):\\n\", zeros_2d)# 创建一个 2x2x2 的三维全零数组,指定为整数类型zeros_3d_int = np.zeros((2, 2, 2), dtype=int)print(\"\\nzeros((2, 2, 2), dtype=int):\\n\", zeros_3d_int)print(\"Dtype:\", zeros_3d_int.dtype)# 创建一个 5x1 的全零列向量zeros_col_vector = np.zeros((5, 1))print(\"\\nzeros((5, 1)) (列向量):\\n\", zeros_col_vector)
何时使用 np.zeros()
?
当你需要一个预填充零的数组作为占位符、初始化缓冲区、或者在某些算法中作为计数器时,np.zeros()
非常有用。
2.4 np.ones()
:创建全一数组
np.ones()
函数类似于 np.zeros()
,但它创建的是一个全一的数组。
- 功能: 返回一个由一填充的
ndarray
。 - 常用参数:
shape
: 整数或整数元组,定义数组的形状。dtype
: 可选参数,指定数组元素的数据类型。默认为float64
。
示例与说明:
# 创建一个 4 个元素的一维全一数组ones_1d = np.ones(4)print(\"\\nones(4):\\n\", ones_1d)# 创建一个 3x2 的二维全一数组,指定为布尔类型ones_2d_bool = np.ones((3, 2), dtype=bool)print(\"\\nones((3, 2), dtype=bool):\\n\", ones_2d_bool) # 1 会被转换为 True# 创建一个 2x2x1 的三维全一数组ones_3d = np.ones((2, 2, 1))print(\"\\nones((2, 2, 1)):\\n\", ones_3d)
何时使用 np.ones()
?
当需要一个预填充一的数组进行乘法初始化、权重计算或作为某些算法的基准值时,np.ones()
是非常方便的。
2.5 np.linspace()
:创建等间隔序列
np.linspace()
函数与 np.arange()
类似,都是创建等差序列,但它们在参数定义上有所不同:linspace
侧重于指定起始点、终止点和元素个数,而 arange
侧重于起始点、终止点和步长。
- 功能: 在指定间隔内返回均匀分布的数字,包含起始值和终止值。
- 常用参数:
start
: 序列的起始值。stop
: 序列的终止值(默认包含)。num
: 可选参数,要生成的样本数量。默认为 50。endpoint
: 可选参数,布尔值。如果为True
(默认),则包含stop
值;如果为False
,则不包含stop
值。retstep
: 可选参数,布尔值。如果为True
,则返回步长。dtype
: 可选参数,结果数组的数据类型。
示例与说明:
# 在 0 到 10 之间生成 5 个均匀分布的数 (包含 0 和 10)arr_linspace1 = np.linspace(0, 10, 5)print(\"\\nlinspace(0, 10, 5):\", arr_linspace1) # [ 0. 2.5 5. 7.5 10. ]# 在 0 到 10 之间生成 5 个数,但不包含 10arr_linspace2 = np.linspace(0, 10, 5, endpoint=False)print(\"linspace(0, 10, 5, endpoint=False):\", arr_linspace2) # [0. 2. 4. 6. 8.]# 返回步长信息arr_linspace3, step_size = np.linspace(0, 1, 11, retstep=True)print(\"linspace(0, 1, 11, retstep=True):\", arr_linspace3)print(\"步长:\", step_size) # 0.1# 默认生成 50 个点arr_linspace_default = np.linspace(0, 1)print(\"\\nlinspace(0, 1) (默认 50 个点):\", arr_linspace_default.shape)
何时使用 np.linspace()
?
当你需要在指定范围内(通常是连续的浮点数范围)生成固定数量的均匀分布点时,np.linspace()
是最佳选择。这在绘制函数图像、模拟连续变量或在给定区间内采样时非常有用。
3. 其他常用数组创建函数 (简要提及)
除了上述五个核心函数,NumPy 还提供了许多其他方便的数组创建函数:
np.empty(shape, dtype)
: 创建指定形状和数据类型的新数组,但不初始化其元素。元素值是随机的(取决于内存中已有的数据)。比zeros
或ones
稍快,因为不需填充。np.full(shape, fill_value, dtype)
: 创建指定形状并用fill_value
填充的数组。np.eye(N, M=None, k=0, dtype=float)
: 创建一个对角线为 1,其他地方为 0 的二维数组(单位矩阵或其变体)。np.identity(N, dtype=None)
: 创建一个 N x N 的单位矩阵。np.copy(a)
: 创建数组a
的一个副本。np.frombuffer()
,np.fromfile()
,np.fromfunction()
,np.fromiter()
: 从其他源创建数组。
总结
本篇详细介绍了 NumPy 中最常用的五种数组创建方法:
np.array()
: 将现有的 Python 序列转换为ndarray
。np.arange()
: 创建等差序列,通过start
,stop
,step
控制。np.zeros()
: 创建全零数组,适用于初始化。np.ones()
: 创建全一数组,适用于初始化或作为乘法的基数。np.linspace()
: 创建等间隔序列,通过start
,stop
,num
控制,特别适合生成连续数据点。
熟练掌握这些函数是高效使用 NumPy 的基础,也是迈向更高级数据科学技能的第一步。
练习题
尝试独立完成以下练习题,并通过答案进行对照:
-
使用
np.array()
:- 创建一个包含整数
10, 20, 30, 40, 50
的一维 NumPy 数组,并打印其dtype
。 - 创建一个包含浮点数
[1.1, 2.2, 3.3]
的一维 NumPy 数组,并打印其dtype
。 - 创建一个 2x3 的二维数组,数据为
[[1, 2, 3], [4, 5, 6]]
。 - 创建一个 3x2 的二维数组,包含布尔值
[[True, False], [True, True], [False, False]]
。
- 创建一个包含整数
-
使用
np.arange()
:- 创建一个从 0 到 10(不包含 10)的整数数组。
- 创建一个从 5 到 15(不包含 15),步长为 3 的整数数组。
- 创建一个从 100 递减到 90(包含 90),步长为 -2 的整数数组。
- 创建一个从 0.1 到 1.0(不包含 1.0),步长为 0.2 的浮点数数组。
-
使用
np.zeros()
和np.ones()
:- 创建一个 4 个元素的零向量,类型为
int
。 - 创建一个 3x3 的零矩阵。
- 创建一个 2x4 的一矩阵。
- 创建一个 5 个元素的一向量,类型为
bool
。 - 创建一个 3x2x2 的三维全零数组。
- 创建一个 4 个元素的零向量,类型为
-
使用
np.linspace()
:- 创建一个从 0 到 10 之间包含 5 个均匀间隔点的数组(包含 0 和 10)。
- 创建一个从 -5 到 5 之间包含 10 个均匀间隔点的数组(不包含 5)。
- 创建一个从 0 到 2 p i 2\\\\pi 2pi (约 6.28) 之间包含 100 个均匀间隔点的数组,用于绘制正弦波。
-
综合应用:
- 创建一个 3x3 的单位矩阵(对角线为 1,其他为 0)。
- 创建一个形状为 (2, 3) 的数组,所有元素都为 7。
- 生成一个 4x4 的随机整数数组,范围在 1 到 50 之间。
- 将上述随机整数数组重塑为一个 2x8 的数组。
练习题答案
import numpy as npimport math # 用于练习5中的数学常数print(\"--- 练习题答案 ---\")# 1. 使用 np.array():print(\"\\n--- 练习 1: 使用 np.array() ---\")arr_int = np.array([10, 20, 30, 40, 50])print(\"整数数组:\", arr_int, \"Dtype:\", arr_int.dtype)arr_float_explicit = np.array([1.1, 2.2, 3.3])print(\"浮点数数组:\", arr_float_explicit, \"Dtype:\", arr_float_explicit.dtype)arr_2x3 = np.array([[1, 2, 3], [4, 5, 6]])print(\"2x3 二维数组:\\n\", arr_2x3)arr_bool_2d = np.array([[True, False], [True, True], [False, False]])print(\"3x2 布尔数组:\\n\", arr_bool_2d)# 2. 使用 np.arange():print(\"\\n--- 练习 2: 使用 np.arange() ---\")arr_0_to_10 = np.arange(10)print(\"0到10 (不含10):\", arr_0_to_10)arr_5_to_15_step3 = np.arange(5, 15, 3)print(\"5到15 (不含15), 步长3:\", arr_5_to_15_step3)arr_100_down_to_90 = np.arange(100, 89, -2) # stop 是不包含的,所以是 89print(\"100递减到90, 步长-2:\", arr_100_down_to_90)arr_float_step = np.arange(0.1, 1.0, 0.2)print(\"0.1到1.0 (不含1.0), 步长0.2:\", arr_float_step)# 3. 使用 np.zeros() 和 np.ones():print(\"\\n--- 练习 3: 使用 np.zeros() 和 np.ones() ---\")zeros_int = np.zeros(4, dtype=int)print(\"4个元素的零向量 (int):\", zeros_int)zeros_3x3 = np.zeros((3, 3))print(\"3x3 零矩阵:\\n\", zeros_3x3)ones_2x4 = np.ones((2, 4))print(\"2x4 一矩阵:\\n\", ones_2x4)ones_bool = np.ones(5, dtype=bool)print(\"5个元素的一向量 (bool):\", ones_bool)zeros_3x2x2 = np.zeros((3, 2, 2))print(\"3x2x2 三维全零数组:\\n\", zeros_3x2x2)# 4. 使用 np.linspace():print(\"\\n--- 练习 4: 使用 np.linspace() ---\")linspace_0_10_5 = np.linspace(0, 10, 5)print(\"0到10之间5个点 (包含两端):\", linspace_0_10_5)linspace_neg5_pos5_10_no_endpoint = np.linspace(-5, 5, 10, endpoint=False)print(\"-5到5之间10个点 (不含右端):\", linspace_neg5_pos5_10_no_endpoint)linspace_0_2pi_100 = np.linspace(0, 2 * math.pi, 100)print(\"0到2pi之间100个点,用于绘图:\", linspace_0_2pi_100.shape)# print(linspace_0_2pi_100) # 打印所有点会太长,只打印形状# 5. 综合应用:print(\"\\n--- 练习 5: 综合应用 ---\")identity_matrix = np.eye(3) # 或 np.identity(3)print(\"3x3 单位矩阵:\\n\", identity_matrix)full_array = np.full((2, 3), 7)print(\"2x3 全7数组:\\n\", full_array)random_4x4 = np.random.randint(1, 51, size=(4, 4))print(\"4x4 随机整数数组 (1-50):\\n\", random_4x4)reshaped_array = random_4x4.reshape((2, 8))print(\"重塑为 2x8 数组:\\n\", reshaped_array)