《Python NumPy 模块:从基础到实战的科学计算之旅》

NumPy模块

NumPy(Numerical Python)是 Python 中用于科学计算的基础库,它提供了高性能的多维数组对象和处理这些数组的工具【主要针对线性代数 图形图像 大批量数据计算 方程求解】。

pip

pip 是 Python 的包管理工具,下面是一些 pip 的常用命令:

  • 显示pip的版本:pip --version

  • 查看 pip 命令的帮助信息:pip --help

  • 查看已安装的包:pip list

  • 安装最新版本的包:pip install package_name

  • 安装指定版本的包:pip install package_name==version_number

  • 升级指定的包到最新版本:pip install --upgrade package_name

  • 卸载指定的包:pip uninstall package_name

  • 查看包的详细信息:pip show package_name

1. 数组创建

NumPy 的核心是 ndarray(N-dimensional array)对象,也就是多维数组。可以通过多种方式创建数组。

import numpy as np
# 从列表创建一维数组
lst = [1,2,3,4,5]
print(lst)
arr = np.array([1,2,3,4,5])
print(arr)
# 从列表创建二维数组 3 × 3 矩阵
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr)

# 全0矩阵 3 × 4 矩阵
arr = np.zeros((3,4))
print(arr)
# 全1矩阵 3 × 4 矩阵
arr = np.ones((3,4))
print(arr)

# 创建指定值的矩阵
arr = np.full((3,4), 8)
print(arr)

# 创建等差数列矩阵 start stop step stop不可取
arr = np.arange(0,10,2)
print(arr)

# 创建等间隔的矩阵 从0到1范围内 等间隔均取5个数字 stop可取
arr = np.linspace(0,1,5)
print(arr)

# 创建随机的矩阵 0~10之间的范围 随机20个数字 4 × 5 矩阵
arr = np.random.randint(10, size = 20).reshape(4,5)
print(arr)

# 持久化 把矩阵数据进行本地存储:文件名 矩阵
# data.npy
np.save("data", arr)
# 读取np数据文件
arr = np.load("data.npy")
print(arr)

2. 数组属性

可以通过数组的属性来获取数组的相关信息。

import numpy as np
"""
1 2 3 4
5 6 7 8
"""
arr = np.array([[1,2,3,4],[5,6,7,8]])
# 维度
print(arr.ndim) # 2 -> 二维
# arr = np.array([[[1,1,1],[1,1,1]],[[1,1,1],[1,1,1]]])
# print(arr.ndim) # 3 -> 三维

# 形状
print(arr.shape)

# 总数 行 × 列 值
print(arr.size)

# 元素类型
print(arr.dtype) # int64 比特位 -> 8字节

3. 数组索引和切片

可以像操作 Python 列表一样对 NumPy 数组进行索引和切片操作。

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
# 索引操作 和 列表的操作一致
print(arr[0])
print(arr[3])
print(arr[-1])
# 切片操作 和 列表的操作一致
print(arr[1:4])

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)
print(arr[0][0])
print(arr[-1][-1])
# 需要注意特殊操作 [行区域,列区域]
print(arr[0, 0])
print(arr[-1, -1])
# 获取第2行的所有元素
print(arr[1, :])
print(arr[1])
print(arr[1, 0:2])
# 获取第2列的所有元素
print(arr[:, 1])
# 获取
"""
5 6
8 9
"""
print(arr[1:, 1:])

4. 数组运算

NumPy 数组支持多种数学运算,包括元素级运算、矩阵运算等。

import numpy as np

arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr1)
print(arr2)
# 元素级操作
print(arr1 + arr2)
print(arr1 - arr2)
print(arr1 * arr2)
print(arr1 / arr2)
print(arr1 + 3)
print(arr1 * 3)
# 矩阵乘法(A行B列 × B行C列 = A行C列)
# 2 × 3
arr3 = np.array([[1,2,3],[4,5,6]])
# 3 × 4
arr4 = np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4]])
# 2 × 4
arr5 = np.dot(arr3, arr4)
print(arr5)

5. 数学和统计函数

NumPy 提供了丰富的数学和统计函数。

import numpy as np

arr = np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4]])
"""
1 2 3 4
1 2 3 4
1 2 3 4
"""
# 计算元素和
print(np.sum(arr))
# 计算平均值
print(np.mean(arr))
# 计算最大值/最小值
print(np.max(arr))
# 计算标准差
print(np.std(arr))

# 计算第2行的平均值
print(np.mean(arr[1, :]))
# 计算第2列的标准差
print(np.std(arr[:, 1]))

6. 数组的变形和拼接

可以对数组进行形状的改变和拼接操作。

import numpy as np

arr = np.array([1,2,3,4,5,6,7,8])
print(arr)
arr1 = arr.reshape((4,2))
print(arr1)
arr2 = arr.reshape((2,2,2))
print(arr2)

arr3 = arr1.reshape(2,4)
print(arr3)

# 拼接 水平 垂直
arr1 = np.array([[1,2],[3,4]])
"""
1 2
3 4
"""
arr2 = np.array([[5,6],[7,8]])
"""
5 6
7 8
"""
arr3 = np.hstack((arr1, arr2))
print(arr3)
arr4 = np.vstack((arr1,arr2))
print(arr4)

7. 布尔索引

可以使用布尔数组来筛选数组中的元素。

import numpy as np

arr = np.array([1,2,3,4,5,6,7,8])
arr1 = arr > 3 # 产生一个布尔类型数组 长度与矩阵一致 True False
# 标记
print(arr1)
arr2 = arr[arr1] # 过滤
print(arr2)

8. 线性代数运算

NumPy 提供了线性代数相关的函数,如矩阵的转置、求逆等。

import numpy as np

arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
"""
1 2 3 4
5 6 7 8
"""
arr1 = arr.T  # 转置
print(arr1)
# 求逆 必须要求方阵(奇异矩阵不可逆)
arr = np.array([[1, 2], [3, 4]])
print(arr)
arr2 = np.linalg.inv(arr)
print(arr2)

9. 案例:股票收益率分析

假设你是一位投资者,想要分析某几只股票在一段时间内的收益率情况。通过计算股票的日收益率、平均收益率和收益率的标准差,你可以评估这些股票的表现和风险程度。标准差越大,说明股票的收益率波动越大,风险也就越高。

import numpy as np

# 假设我们有 3 只股票,在 10 个交易日内的收盘价数据
# 每一行代表一只股票,每一列代表一个交易日
closing_prices = np.array([
    [100, 102, 105, 103, 106, 108, 109, 110, 107, 109],
    [200, 202, 205, 203, 206, 208, 209, 210, 207, 209],
    [300, 302, 305, 303, 306, 308, 309, 310, 307, 309]
])

# 计算每只股票的日收益率
# 日收益率:(今日收盘价 - 昨日收盘价) / 昨日收盘价
"""
今日收盘价 矩阵
102, 105, 103, 106, 108, 109, 110, 107, 109
202, 205, 203, 206, 208, 209, 210, 207, 209
302, 305, 303, 306, 308, 309, 310, 307, 309
昨日收盘价 矩阵
100, 102, 105, 103, 106, 108, 109, 110, 107
200, 202, 205, 203, 206, 208, 209, 210, 207
300, 302, 305, 303, 306, 308, 309, 310, 307
"""
# 每只股票每日的收益率
daily_returns = (closing_prices[:, 1:] - closing_prices[:, :-1]) / closing_prices[:, :-1]
print(daily_returns)

# 每只股票的平均收益率 axis = 1 按行计算 axis = 0 按列计算
average = np.mean(daily_returns, axis=1)
print(average)
# 每只股票的标准差
std_daily = np.std(daily_returns, axis=1)
print(std_daily)
for i in range(len(average)):
    print(f'股票{i + 1}的平均日收益率:{average[i]:.4f}')
    print(f'股票{i + 1}的收益率的标准差:{std_daily[i]:.4f}')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值