第一个 NumPy 程序
在这一章中,我们将编写第一个 NumPy 程序,通过实际的代码示例来感受 NumPy 的强大功能。
Hello NumPy
让我们从最简单的 NumPy 程序开始:
python
# 导入 NumPy 库
import numpy as np
# 创建第一个数组
my_array = np.array([1, 2, 3, 4, 5])
# 打印数组
print("我的第一个 NumPy 数组:")
print(my_array)
# 打印数组类型
print(f"数组类型: {type(my_array)}")
# 打印数组形状
print(f"数组形状: {my_array.shape}")输出结果:
我的第一个 NumPy 数组:
[1 2 3 4 5]
数组类型: <class 'numpy.ndarray'>
数组形状: (5,)基本数组操作
创建不同类型的数组
python
import numpy as np
# 一维数组
array_1d = np.array([1, 2, 3, 4, 5])
print("一维数组:", array_1d)
# 二维数组
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:")
print(array_2d)
# 三维数组
array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print("三维数组:")
print(array_3d)输出结果:
一维数组: [1 2 3 4 5]
二维数组:
[[1 2 3]
[4 5 6]]
三维数组:
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]使用内置函数创建数组
python
import numpy as np
# 创建全零数组
zeros_array = np.zeros(5)
print("全零数组:", zeros_array)
# 创建全一数组
ones_array = np.ones((2, 3))
print("全一数组:")
print(ones_array)
# 创建等差数列
range_array = np.arange(0, 10, 2)
print("等差数列:", range_array)
# 创建等间距数组
linspace_array = np.linspace(0, 1, 5)
print("等间距数组:", linspace_array)
# 创建随机数组
random_array = np.random.random(5)
print("随机数组:", random_array)输出结果:
全零数组: [0. 0. 0. 0. 0.]
全一数组:
[[1. 1. 1.]
[1. 1. 1.]]
等差数列: [0 2 4 6 8]
等间距数组: [0. 0.25 0.5 0.75 1. ]
随机数组: [0.37454012 0.95071431 0.73199394 0.59865848 0.15601864]数组的基本属性
python
import numpy as np
# 创建一个二维数组
array = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print("原始数组:")
print(array)
print()
# 数组的基本属性
print(f"数组维度: {array.ndim}")
print(f"数组形状: {array.shape}")
print(f"数组大小: {array.size}")
print(f"数据类型: {array.dtype}")
print(f"每个元素的字节数: {array.itemsize}")
print(f"数组占用的总字节数: {array.nbytes}")输出结果:
原始数组:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
数组维度: 2
数组形状: (3, 4)
数组大小: 12
数据类型: int32
每个元素的字节数: 4
数组占用的总字节数: 48基本数学运算
数组与标量运算
python
import numpy as np
# 创建数组
array = np.array([1, 2, 3, 4, 5])
print("原始数组:", array)
# 加法
print("加 10:", array + 10)
# 乘法
print("乘以 2:", array * 2)
# 幂运算
print("平方:", array ** 2)
# 除法
print("除以 2:", array / 2)输出结果:
原始数组: [1 2 3 4 5]
加 10: [11 12 13 14 15]
乘以 2: [ 2 4 6 8 10]
平方: [ 1 4 9 16 25]
除以 2: [0.5 1. 1.5 2. 2.5]数组与数组运算
python
import numpy as np
# 创建两个数组
array1 = np.array([1, 2, 3, 4, 5])
array2 = np.array([10, 20, 30, 40, 50])
print("数组1:", array1)
print("数组2:", array2)
print()
# 元素级运算
print("相加:", array1 + array2)
print("相减:", array2 - array1)
print("相乘:", array1 * array2)
print("相除:", array2 / array1)输出结果:
数组1: [1 2 3 4 5]
数组2: [10 20 30 40 50]
相加: [11 22 33 44 55]
相减: [ 9 18 27 36 45]
相乘: [ 10 40 90 160 250]
相除: [10. 10. 10. 10. 10.]数组索引和切片
一维数组索引
python
import numpy as np
# 创建数组
array = np.array([10, 20, 30, 40, 50])
print("原始数组:", array)
# 正向索引
print("第一个元素:", array[0])
print("第三个元素:", array[2])
# 反向索引
print("最后一个元素:", array[-1])
print("倒数第二个元素:", array[-2])
# 切片操作
print("前三个元素:", array[:3])
print("后三个元素:", array[-3:])
print("中间元素:", array[1:4])
print("每隔一个元素:", array[::2])输出结果:
原始数组: [10 20 30 40 50]
第一个元素: 10
第三个元素: 30
最后一个元素: 50
倒数第二个元素: 40
前三个元素: [10 20 30]
后三个元素: [30 40 50]
中间元素: [20 30 40]
每隔一个元素: [10 30 50]二维数组索引
python
import numpy as np
# 创建二维数组
array_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("二维数组:")
print(array_2d)
print()
# 访问单个元素
print("第一行第一列:", array_2d[0, 0])
print("第二行第三列:", array_2d[1, 2])
print("最后一行最后一列:", array_2d[-1, -1])
# 访问整行或整列
print("第一行:", array_2d[0, :])
print("第二列:", array_2d[:, 1])
# 切片操作
print("前两行前两列:")
print(array_2d[:2, :2])输出结果:
二维数组:
[[1 2 3]
[4 5 6]
[7 8 9]]
第一行第一列: 1
第二行第三列: 6
最后一行最后一列: 9
第一行: [1 2 3]
第二列: [2 5 8]
前两行前两列:
[[1 2]
[4 5]]常用数学函数
python
import numpy as np
# 创建数组
array = np.array([1, 4, 9, 16, 25])
print("原始数组:", array)
# 数学函数
print("平方根:", np.sqrt(array))
print("对数:", np.log(array))
print("指数:", np.exp([1, 2, 3]))
# 三角函数
angles = np.array([0, np.pi/4, np.pi/2, np.pi])
print("角度:", angles)
print("正弦值:", np.sin(angles))
print("余弦值:", np.cos(angles))
# 统计函数
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print("数据:", data)
print("平均值:", np.mean(data))
print("标准差:", np.std(data))
print("最大值:", np.max(data))
print("最小值:", np.min(data))
print("总和:", np.sum(data))输出结果:
原始数组: [ 1 4 9 16 25]
平方根: [1. 2. 3. 4. 5.]
对数: [0. 1.38629436 2.19722458 2.77258872 3.21887582]
指数: [ 2.71828183 7.3890561 20.08553692]
角度: [0. 0.78539816 1.57079633 3.14159265]
正弦值: [0.0000000e+00 7.0710678e-01 1.0000000e+00 1.2246468e-16]
余弦值: [ 1.00000000e+00 7.07106781e-01 6.12323400e-17 -1.00000000e+00]
数据: [ 1 2 3 4 5 6 7 8 9 10]
平均值: 5.5
标准差: 2.8722813232690143
最大值: 10
最小值: 1
总和: 55实际应用示例
示例1:计算学生成绩统计
python
import numpy as np
# 学生成绩数据(5个学生,3门课程)
scores = np.array([
[85, 92, 78], # 学生1
[90, 88, 85], # 学生2
[78, 85, 92], # 学生3
[92, 90, 88], # 学生4
[88, 85, 90] # 学生5
])
print("学生成绩表:")
print(scores)
print()
# 计算每个学生的平均分
student_avg = np.mean(scores, axis=1)
print("每个学生的平均分:", student_avg)
# 计算每门课程的平均分
subject_avg = np.mean(scores, axis=0)
print("每门课程的平均分:", subject_avg)
# 找出最高分和最低分
print(f"最高分: {np.max(scores)}")
print(f"最低分: {np.min(scores)}")
# 计算总体平均分
overall_avg = np.mean(scores)
print(f"总体平均分: {overall_avg:.2f}")输出结果:
Student scores:
[[85 92 78]
[90 88 85]
[78 85 92]
[92 90 88]
[88 85 90]]
每个学生的平均分: [85. 87.66666667 85. 90. 87.66666667]
每门课程的平均分: [86.6 88. 86.6]
最高分: 92
最低分: 78
总体平均分: 87.00示例2:简单的数据分析
python
import numpy as np
# 模拟一周的温度数据
temperatures = np.array([22, 25, 28, 30, 27, 24, 21])
days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
print("一周温度数据:")
for day, temp in zip(days, temperatures):
print(f"{day}: {temp}°C")
print()
# 统计分析
print(f"平均温度: {np.mean(temperatures):.1f}°C")
print(f"最高温度: {np.max(temperatures)}°C")
print(f"最低温度: {np.min(temperatures)}°C")
print(f"温度范围: {np.max(temperatures) - np.min(temperatures)}°C")
print(f"标准差: {np.std(temperatures):.2f}°C")
# 找出高于平均温度的天数
avg_temp = np.mean(temperatures)
high_temp_days = temperatures > avg_temp
print(f"\n高于平均温度的天数: {np.sum(high_temp_days)}天")
print("具体是:", np.array(days)[high_temp_days])输出结果:
一周温度数据:
周一: 22°C
周二: 25°C
周三: 28°C
周四: 30°C
周五: 27°C
周六: 24°C
周日: 21°C
平均温度: 25.3°C
最高温度: 30°C
最低温度: 21°C
温度范围: 9°C
标准差: 3.20°C
高于平均温度的天数: 3天
具体是: ['周三' '周四' '周五']常见错误和注意事项
1. 导入别名
python
# 正确的导入方式
import numpy as np
# 避免这样做
from numpy import * # 会污染命名空间2. 数组维度
python
# 注意数组的维度
array_1d = np.array([1, 2, 3]) # 形状: (3,)
array_2d = np.array([[1, 2, 3]]) # 形状: (1, 3)
print(array_1d.shape) # (3,)
print(array_2d.shape) # (1, 3)3. 数据类型
python
# 整数除法可能导致精度丢失
array_int = np.array([1, 2, 3])
result = array_int / 2
print(result) # [0.5 1. 1.5] - 自动转换为浮点数
# 指定数据类型
array_float = np.array([1, 2, 3], dtype=np.float64)本章小结
在这一章中,我们学习了:
- 如何创建第一个 NumPy 程序
- 数组的基本创建方法
- 数组的基本属性和操作
- 数组的索引和切片
- 基本的数学运算和函数
- 实际应用示例
- 常见错误和注意事项
下一步
在下一章中,我们将深入学习 NumPy 的基础概念,包括数组的内部结构、内存布局等更深层的知识。
练习题
- 创建一个包含 1 到 20 的数组,计算其平方和立方
- 创建一个 3x3 的随机数组,找出最大值和最小值的位置
- 创建两个数组,计算它们的点积
- 模拟掷骰子 1000 次,统计每个点数出现的频率
- 创建一个温度转换程序,将摄氏度转换为华氏度