Skip to content

第一个 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. 创建一个包含 1 到 20 的数组,计算其平方和立方
  2. 创建一个 3x3 的随机数组,找出最大值和最小值的位置
  3. 创建两个数组,计算它们的点积
  4. 模拟掷骰子 1000 次,统计每个点数出现的频率
  5. 创建一个温度转换程序,将摄氏度转换为华氏度

本站内容仅供学习和研究使用。