于 Jupyter 天地,借 NumPy 之手编织数据锦缎

发布于:2025-04-18 ⋅ 阅读:(18) ⋅ 点赞:(0)

引言

NumPy是Python科学计算的核心库之一,提供了强大的多维数组对象和丰富的数学函数,是数据科学、机器学习等领域不可或缺的工具。结合Jupyter Notebook的交互式环境,NumPy的使用变得更加直观和高效。本文将介绍如何在Jupyter中充分利用NumPy进行科学计算。

一. 搭建 Jupyter 与 NumPy 协同舞台

NumPy是第三方库,需要先安装才能使用:

Windows系统

  1. 打开cmd(在菜单栏搜索cmd)

  2. 输入命令:pip install numpy 或 pip3 install numpy

MacOS系统

  1. 打开终端(点击顶部菜单栏放大镜图标,输入"终端"或"terminal")

  2. 输入同样的安装命令

然后在Jupyter中导入NumPy:

import numpy as np

二. 深入剖析 NumPy 的 NDarray 核心

        NumPy里最核心的的数据结构叫 ND array(N维数组) 如图:

1. 拆解 NumPy 数组与 Python 列表异同

1.1 相似之处

  • 都可以通过索引获取元素

  • 都可以通过切片获取子集

  • 都可以迭代元素

1.2 不同之处

  1. 类型一致性:NumPy数组要求所有元素必须是同一类型(如全数字或全字符串),而Python列表没有这个限制

  2. 性能优势:对NumPy数组进行大规模数学运算时,执行速度远高于Python内置列表

  3. 丰富功能:NumPy提供了大量专门用于数值运算的函数(如求平均值、标准差等)

总结

特性 ndarray Python列表
元素类型 必须一致 可以混合
内存占用 更小 更大
运算速度 更快 较慢
内置方法 丰富的数学运算 基本列表操作

2. 探索 NumPy 数组的多样创建路径

2.1 基本创建方法

最直观的方法是使用np.array()将列表转换为数组:

#一维数组
arr1 = np.array([1, 2, 3])
arr1

#二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
arr2

维度判断技巧:观察最左边有几个方括号,就是几维数组。

技巧

  • 嵌套列表创建多维数组

  • 最外层方括号数量决定数组维度

注意:虽然可以传入不同类型的元素,但array()方法会强制将它们转换为同一类型,因此最好一开始就传入同类型元素。如:

np.array(["hello", True, 3.14])

2.2 解锁 NumPy 数组关键属性奥秘

NumPy数组有几个重要属性:

# 创建一个示例数组
arr = np.array([[1, 2, 3], [4, 5, 6]])

print("维度数(ndim):", arr.ndim)  # 2
print("形状(shape):", arr.shape)  # (2, 3) - 表示2行3列
print("元素总数(size):", arr.size)  # 6
print("元素类型(dtype):", arr.dtype)  # int64

 效果展示:

 

  • ndim:返回数组的维度数

  • shape:返回表示各维度大小的元组

  • size:返回数组元素总数

  • dtype:返回数组元素类型(如int64表示64位整数)

注意

  • 单元素元组用逗号表示,如(7,)

  • shape元组中数字表示各维度大小

  • int表示整数

  • 64表示64位存储空间

  • 不同电脑可能显示int32或int64

  • 结束值不被包含,所以用21才能包含20

  • 步长2确保只选择偶数

2.3 挖掘 NumPy 便捷数组创建方法宝藏

NumPy提供了多种便捷的数组创建方法:

# 全零数组
zeros = np.zeros(5)  # 创建长度为5的全零数组
print(zeros)

# 全一数组
ones = np.ones((2, 3))  # 创建2x3的全一数组
print(ones)

# 类似range的arange
seq = np.arange(5, 10, 2)  # 从5开始,到10结束(不含),步长为2
print(seq)

效果展示:

注意zeros()ones()默认创建浮点数数组(数字后有小数点)

三、使用数组练习

建议做完再看答案 

答案

写出导入numpy的语句,并且给numpy别名为np。

import numpy as np

创建一个变量名为arr1的一维数组,里面的元素为整数6、2、-7、2、8、-2、1。

arr1 = np.array([6, 2, -7, 2, 8, -2, 1])

创建一个变量名为arr2的二维数组,里面的元素为以下两个数组:由整数1、3、5组成的一维数组,以及由整数2、4、6组成的一维数组。

arr2 = np.array([[1, 3, 5], [2, 4, 6]])

分别打印arr1arr2的维度、形状、元素数量、元素类型。

arr1 = np.array([6, 2, -7, 2, 8, -2, 1])
arr1

分别打印arr1arr2的维度、形状、元素数量、元素类型。

print(arr1.ndim)
print(arr2.ndim)
print(arr1.shape)
print(arr2.shape)
print(arr1.size)
print(arr2.size)
print(arr1.dtype)
print(arr2.dtype)

创建一个变量名为arr_all_0的一维数组,里面的元素为6个0。

arr_all_0 = np.zeros(6)
print(arr_all_0)

创建一个变量名为arr_all_1的一维数组,里面的元素为6个1。

arr_all_1 = np.ones(6)
print(arr_all_1)

创建一个变量名为arr_even的一维数组,里面的元素为10(包括10)到20(包括20)之间的偶数。

arr_even = np.arange(10, 21, 2)
print(arr_even)

四、NumPy核心操作全解析

4.1 数组拼接:灵活组合数据

(1) 基础拼接方法
import numpy as np

# 创建示例数组
arr1 = np.zeros(3)  # [0., 0., 0.]
arr2 = np.array([7, 8, 9])  # [7, 8, 9]

# 使用concatenate拼接
combined = np.concatenate([arr1, arr2])
print(combined)  # 输出: [0. 0. 0. 7. 8. 9.]

关键点解析

  • 类型统一:浮点数和整数拼接时,结果会自动转为浮点数

  • 多数组拼接:np.concatenate([arr1, arr2, arr3, ...])

  • 维度一致:所有输入数组必须维度相同

(2)多维数组拼接
# 创建2D数组
arr2d_1 = np.array([[1, 2], [3, 4]])
arr2d_2 = np.array([[5, 6], [7, 8]])

# 垂直拼接(沿axis=0)
vertical = np.concatenate([arr2d_1, arr2d_2], axis=0)
"""
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
"""

# 水平拼接(沿axis=1)
horizontal = np.concatenate([arr2d_1, arr2d_2], axis=1)
"""
[[1 2 5 6]
 [3 4 7 8]]
"""

关键点和一维相同

4.2数组排序:两种方式对比

(1)返回新数组的np.sort()
arr = np.array([3, 1, 4, 2])
sorted_arr = np.sort(arr)  # 返回新数组
print(sorted_arr)  # [1 2 3 4]
print(arr)         # 原数组不变: [3 1 4 2]
(2)原地排序的arr.sort()
arr = np.array([3, 1, 4, 2])
arr.sort()         # 直接修改原数组
print(arr)         # [1 2 3 4]

应用场景选择

  • 需要保留原始数据时 → np.sort()

  • 内存有限或不需要原始数据时 → arr.sort()

4.3 索引与切片:精准数据访问

(1)基础索引技巧
arr = np.array([10, 20, 30, 40, 50])

# 正索引
print(arr[0])   # 10 (第一个元素)
print(arr[2])   # 30 

# 负索引
print(arr[-1])  # 50 (最后一个)
print(arr[-3])  # 30
(2) 灵活切片操作
# 基本切片
print(arr[1:4])  # [20 30 40] (索引1到3)
print(arr[:3])   # [10 20 30] (前三个)
print(arr[2:])   # [30 40 50] (索引2到最后)

# 带步长的切片
print(arr[::2])  # [10 30 50] (每隔一个元素)

五、NumPy高级特性揭秘

5.1. 广播机制解析

        广播机制是NumPy最强大的特性之一,允许不同形状数组进行数学运算:NumPy自动将标量"广播"到数组每个元素执行运算

类似线性代数向量和标量相乘,运算时,标量会运用在数组的每一个数字上,如下图:

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print(a + b)  # [5 7 9] (对应元素相加)
print(a * b)  # [4 10 18] (对应元素相乘)

5.2 聚合运算:数据摘要统计

data = np.array([5, 2, 9, 1, 7])

# 常用聚合操作
print("最大值:", data.max())      # 9
print("最小值:", data.min())      # 1
print("总和:", data.sum())       # 24
print("平均值:", data.mean())    # 4.8
print("标准差:", data.std())     # 约2.993

5.3 条件筛选:智能数据过滤

(1)基础条件筛选

arr = np.array([3, 7, 2, 9, 5, 1])

# 简单条件
print(arr[arr > 5])        # [7 9]
print(arr[arr % 2 == 0])   # [2]

运行机制如下:

 当数组与标量进行比较时,NumPy的广播机制会将比较运算自动应用到每个元素上,生成一个布尔值数组。这个布尔数组可以作为掩码来筛选原数组:

arr = np.array([3, 7, 2, 9, 5])
mask = arr > 6  # 生成布尔数组 [False, True, False, True, False]
result = arr[mask]  # 筛选出True位置的元素 [7, 9]

关键点:

  1. 比较操作会广播到每个元素

  2. 返回的布尔数组与原数组形状相同

  3. 布尔索引只保留对应True位置的元素

(2)复合条件筛选

# 使用逻辑运算符
print(arr[(arr > 3) & (arr < 7)])  # [5] (大于3且小于7)
print(arr[(arr < 2) | (arr > 8)])   # [9 1] (小于2或大于8)
print(arr[~(arr > 4)])              # [3 2 1] (不大于4)

逻辑运算符对照表

Python运算符 NumPy运算符
and &
or |
not ~

六、操作数组的不同方法练习

答案

写出导入numpy的语句,并且给numpy别名为np。

import numpy as np

创建arr1为包含了元素1、3、2、4、9的数组,创建arr2为长度为5的由1组成的一维数组,arr3为长度为3的由0组成的一维数组。

arr1 = np.array([1, 3, 2, 4, 9])
arr2 = np.ones(5)
arr3 = np.zeros(3)

创建数组arr4,包括所有arr1、arr2、arr3里面的数字,并输出。

arr4 = np.concatenate([arr1, arr2, arr3])
arr4

更改arr1,对arr1里的元素进行排序,并输出排序后的结果。

arr1.sort()
arr1

用两种方法打印arr1的第三个元素。

print(arr1[2])
print(arr1[-3])

输出从arr1第2个元素到第4个元素组成的的数组。

arr1[1:4]

输出arr1与arr2的同位置元素相加后组成的数组。

arr1 + arr2

输出arr1的各个元素乘以-5后组成的数组。

arr1 * -5

打印arr1数组的最大值、最小值、和、平均值。

print(arr1.max())
print(arr1.min())
print(arr1.sum())
print(arr1.mean())

筛选出arr1数组里所有小于1或大于3的数字,并打印出来。

arr1[(arr1 < 1)|(arr1 > 3)]

网站公告

今日签到

点亮在社区的每一天
去签到