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)


