一、数组的算数运算

# 导入NumPy库,并使用别名np(这是NumPy的常规用法)
import numpy as np

# 创建第一个数组:
# np.arange(1,5,1)生成从1开始到5(不包含5),步长为1的一维数组[1,2,3,4]
# reshape(2,2)将一维数组重塑为2行2列的二维数组

array1 = np.arange(1,5,1).reshape(2,2)

# 创建第二个数组:
# 将array1中的每个元素都乘以2

array2 = 2*array1

# 打印输出array1,查看其内容
# 打印输出array2,查看其内容

print(array1)
print(array2)

# 数组的加法:对应位置的元素分别相加
# 运算规则:array1[i,j] + array2[i,j]

print(array1 + array2)

# 数组的减法:对应位置的元素分别相减
# 运算规则:array1[i,j] - array2[i,j]

print(array1 - array2)

# 数组的乘法(元素乘法):对应位置的元素分别相乘
# 注意:这不是矩阵乘法,而是元素级乘法
# 运算规则:array1[i,j] * array2[i,j]

print(array1 * array2)

# 数组的除法:对应位置的元素分别相除
# 运算规则:array1[i,j] / array2[i,j]

print(array1 / array2)

# 数组取余(模运算):对应位置的元素进行取余运算
# 运算规则:array1[i,j] % array2[i,j]

print(array1 % array2)

# 数组的取整除法:对应位置的元素进行除法后向下取整
# 运算规则:floor(array1[i,j] / array2[i,j])

print(array1 // array2)

二、数组的深拷贝和浅拷贝

# 创建一个一维NumPy数组,包含元素1,2,3

array1 = np.array([1,2,3])

# 浅拷贝(引用赋值)
# 这里并没有创建新的数组,只是让array2指向了与array1相同的内存地址
# array1和array2实际上是同一个数组的两个不同名称

array2 = array1

# 更改array2的第一个元素的值为100

array2[0] = 100

# 打印array2,可以看到第一个元素已变为100

print(array2)

# 打印分隔线,用于区分输出结果
print("####################")
# 打印array1,发现其第一个元素也变为了100
# 这是因为浅拷贝时两者共享同一块内存,修改其中一个会影响另一个

print(array1)

# 深拷贝
# 使用copy()方法创建array1的完全副本,array3拥有独立的内存空间

array3 = array1.copy()

# 更改array3的第一个元素的值为10

array3[0] = 10

# 打印array3,可以看到第一个元素已变为10

print(array3)

# 打印分隔线,用于区分输出结果

print("###################")
print(array1)

# 打印array1,发现其值没有发生变化
# 这是因为深拷贝创建了独立的副本,修改副本不会影响原数组

三、numpy内的随机模块

import random
import numpy as np
import matplotlib.pyplot as plt

# 导入NumPy库,用于生成随机数和数组操作
# 导入random模块(本例中未直接使用,可能用于其他扩展)
# 导入matplotlib的pyplot模块,用于数据可视化

np.random.randint(start, end)

# 函数说明:
# 生成一个[start, end)区间内的随机整数
# 注意:这是左闭右开的区间,即包含start但不包含end

# 设置NumPy随机数生成器的种子
# 种子固定后,每次运行程序生成的随机数序列将完全相同,便于结果重现

np.random.seed(1000)

# 生成一个0到10(不包含10)之间的随机整数

r1 = np.random.randint(0, 10)
print(r1)

# 打印生成的随机整数
# 生成100个随机整数并存储到列表中
# 创建一个空列表用于存储随机数

# 循环100次,生成100个随机数

a = []
for i in range(100):
    # 每次生成一个0到10之间的随机整数
    a0 = np.random.randint(0, 10)
    # 将生成的随机数添加到列表中
    a.append(a0)
print(a)

# 打印包含100个随机数的列表
# 使用matplotlib绘制直方图,展示随机数的分布情况
# color='g'设置直方图颜色为绿色

plt.hist(a, color='g')
plt.show()

# 显示绘制的直方图
# np.random.rand()函数说明:
# 生成一个(0, 1)区间内的随机浮点数

r2 = np.random.rand()

# np.random.normal()函数说明:
# 生成符合正态分布(高斯分布)的随机数
# 默认为标准正态分布 N~(0, 1),即均值为0,标准差为1
# 函数完整参数:numpy.random.normal(loc=0.0, scale=1.0, size=None)
# 参数说明:
#   loc: 正态分布的均值(期望值),决定分布的中心位置,默认值为0.0
#   scale: 正态分布的标准差,决定分布的离散程度,默认值为1.0
#   size: 输出数组的形状,可以是整数(一维数组长度)或元组(多维数组形状),默认返回单个值

# 生成一个符合标准正态分布的随机数

r3 = np.random.normal()
print(r3)

# 打印生成的正态分布随机数

# 生成随机数矩阵

# 生成一个5x5的矩阵,元素为0到10之间的随机整数

r4 = np.random.randint(0, 10, size=(5, 5))
print(r4)

# 打印生成的整数随机矩阵

# 生成一个5x5的矩阵,元素为(0, 1)之间的随机浮点数

r5 = np.random.rand(5, 5)
print(r5)

# 打印生成的浮点数随机矩阵

# 生成一个5x5的矩阵,元素符合均值为5、标准差为10的正态分布

r6 = np.random.normal(5, 10, size=(5, 5))
print(r6)

# 打印生成的正态分布随机矩阵

四、numpy里的一些常用函数

# 生成一个3x3的二维数组,元素服从标准正态分布(均值为0,标准差为1)
# normal()函数默认生成标准正态分布,size=(3,3)指定数组形状为3行3列

array1 = np.random.normal(size=(3,3))
print(array1)

# 打印生成的随机数组,查看其内容
# 数组的一些常用统计函数

# 计算数组所有元素的方差
# 方差是衡量数据离散程度的指标,反映各数据与均值的偏离程度

print(array1.var())

# 计算数组所有元素的标准差
# 标准差是方差的平方根,与原始数据具有相同的量纲

a = array1.std()

# 计算数组所有元素的均值(平均值)
# 均值是所有元素之和除以元素个数,反映数据的中心趋势

b = array1.mean()

# 计算数组所有元素的总和

c = array1.sum()

# 计算数组所有元素的中位数
# 中位数是将数据排序后位于中间位置的数值,不受极端值影响
# 注意:NumPy中中位数需要用np.median()函数,而非数组方法

d = np.median(array1)

# 按指定轴(维度)进行求和运算

# 对矩阵的每一行求和(axis=1表示按行操作)
# 结果是一个一维数组,包含每行元素的总和

e = array1.sum(axis=1)

# 对矩阵的每一列求和(axis=0表示按列操作)
# 结果是一个一维数组,包含每列元素的总和

f = array1.sum(axis=0)

五、矩阵运算

# 生成两个基础矩阵
# 使用arange(4)创建0-3的一维数组,再通过reshape(2,2)转换为2x2矩阵

a = np.arange(4).reshape(2,2)

# 使用copy()方法创建a的深拷贝,确保b是独立的矩阵

b = a.copy()

# 矩阵运算说明
# 矩阵的加减运算:对应位置元素直接加减(与数组元素级运算规则相同)

# 矩阵乘法(点乘/矩阵积)
# 使用dot()方法进行矩阵乘法
# 运算规则:结果矩阵的第i行第j列元素 = a的第i行与b的第j列对应元素相乘后求和

a1 = a.dot(b)

# 也可以使用np.dot()函数进行矩阵乘法,与上面的方法结果相同

a2 = np.dot(a, b)

# 矩阵求逆
# 使用np.linalg.inv()函数计算矩阵的逆矩阵
# 逆矩阵性质:若A的逆矩阵为A⁻¹,则A·A⁻¹ = A⁻¹·A = E(单位矩阵)
# 注意事项:
# 1. 只有方阵(行数=列数)才可能有逆矩阵
# 2. 不是所有方阵都有逆矩阵(奇异矩阵无逆矩阵)
# 3. 若矩阵不可逆,程序会报错,需要使用np.linalg.pinv()求伪逆

a3 = np.linalg.inv(a)

# 验证逆矩阵(以手动输入的逆矩阵为例)
# 用原矩阵a乘以其逆矩阵(这里手动指定了一个逆矩阵)
# 理论上结果应该是单位矩阵(对角线为1,其余为0)

a4 = a.dot([[-1.5, 0.5], [1, 0]])
print(a4)

# 打印验证结果,观察是否接近单位矩阵

六、读取文件

# numpy.loadtxt() 功能说明:
# 从文本文件中加载数据,要求文件中所有行具有相同数量的数据
# 可以使用delimiter参数指定数据之间的分隔符(如逗号、制表符等)

# 使用np.loadtxt()读取文本文件
# 参数说明:
#   第一个参数:文件路径(此处'.txt'为示例,实际使用时需替换为真实文件路径)
#   delimiter='\t':指定分隔符为制表符(Tab键),根据实际文件格式可修改为','等
# 注意:如果文件不存在或格式不正确,会抛出相应异常

data = np.loadtxt('.txt', delimiter='\t')
print(data)

# 打印读取到的数据(通常为NumPy数组格式)

# 将NumPy数组保存到txt文件中的操作

# 创建一个示例二维数组

array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 使用np.savetxt()将数组保存到文本文件
# 参数说明:
#   第一个参数:目标文件路径及名称(此处为'array.txt')
#   第二个参数:要保存的NumPy数组
# 注意:默认保存格式为空格分隔的文本,可通过fmt参数指定格式(如'%d'保存为整数)

np.savetxt('array.txt', array)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐