NumPy基础知识-新手笔记
标签: NumPy基础知识-新手笔记 Python博客 51CTO博客
2023-07-14 18:24:15 121浏览
NumPy基础知识-新手笔记,批处理(mini-batch)批处理可以充分发挥GPU、NumPy平行处理的优势。应用:计算梯度的随机梯度下降(StochasticGradientDescent,SGD)大数据拆分成多个批次:得到数据集;随机打乱数据;定义批大小;批处理数据集;importnumpyasnp#产生10个值在[1,5)的随机数a=np.random.randint(low=1,high=
批处理(mini-batch)
批处理可以充分发挥GPU、NumPy平行处理的优势。
应用:计算梯度的随机梯度下降(Stochastic Gradient Descent, SGD)
大数据拆分成多个批次:
- 得到数据集;
- 随机打乱数据;
- 定义批大小;
- 批处理数据集;
import numpy as np
# 产生10个值在[1, 5)的随机数
a = np.random.randint(low=1, high=5, size=(10))
print("*"*10 + " a " + "*"*10)
print(a)
print("*"*10 + " a[0]到a[8]的sum " + "*"*10)
print(np.sum(a[0:9])) # a[0:9]:下标从0到8
print("*"*10 + " 取整数部分 " + "*"*10)
print(int(1.9))
print(int(-1.9))
运行结果:
import numpy as np
# 生成 10000 个形状为 2×3 的矩阵,满足标准正态分布
data_train = np.random.randn(10000, 2, 3)
print("*"*10 + " data_train " + "*"*10)
print(data_train)
# 这是一个3维矩阵,第1个维度为样本数,后两个维度为数据形状
print("*"*10 + " 数据形状 " + "*"*10)
print(data_train.shape)
# 打乱 10000 条数据
np.random.shuffle(data_train)
print("*"*10 + " data_train " + "*"*10)
print(data_train)
# 定义批量大小
batch_size = 100
# 长度为第一个维度的样本数
print("*"*10 + " len(data_train) " + "*"*10)
print(len(data_train))
# 进行批处理
for i in range(0, len(data_train), batch_size):
x_batch_sum = np.sum(data_train[i:i+batch_size])
print("第{}批次,该批次的数据之和:{}".format(int(i/100), x_batch_sum))
# 第0批次:0 1 2 ... 99 共100个
# 第1批次:100 101 102 ... 199 共100个
# 第2批次:200 201 202 ... 299 共100个
# 第3批次:300 301 302 ... 399 共100个
# ......
# 第99批次:9900 9901 9902 ... 9999 共100个
运行结果:
...
节省内存
X = X + Y 与 X += Y 的区别
结论:X += Y 可减少内存开销
import numpy as np
# 生成 10 个形状为 2×3 的矩阵,满足标准正态分布
Y = np.random.randn(10, 2, 3)
print("*"*10 + " Y " + "*"*10)
print(Y)
# 生成全为0数组,维度与Y一样
X = np.zeros_like(Y)
print("*"*10 + " X " + "*"*10)
print(X)
# X在内存中的地址
print("*"*10 + " X的地址 " + "*"*10)
print(id(X)) # id():引用对象在内存中的确切地址
X = X + Y
# X=X+Y 在内存中的地址
print("*"*10 + " X的地址 " + "*"*10)
print(id(X))
运行结果:
X的 id() 在执行 X = X + Y 的前后发生改变,说明指向了不同的内存区域。
原因:对于 X = X + Y ,Python首先计算 X + Y 并为该结果分配新的内存,然后使X指向内存中这个新位置。
import numpy as np
# 生成 3 个形状为 2×3 的矩阵,满足标准正态分布
Y = np.random.randn(3, 2, 3)
print("*"*10 + " Y " + "*"*10)
print(Y)
# 生成全为0数组,维度与Y一样
X = np.zeros_like(Y)
print("*"*10 + " X " + "*"*10)
print(X)
# X在内存中的地址
print("*"*10 + " X的地址 " + "*"*10)
print(id(X)) # id():引用对象在内存中的确切地址
X += Y
# X=X+Y 在内存中的地址
print("*"*10 + " X的地址 " + "*"*10)
print(id(X))
运行结果:
X的 id() 在执行 X += Y 前后没有改变,说明指向的是同一个内存区域。
X = X + Y 与 X[:] = X + Y的区别
结论:X[:] = X + Y 可减少内存开销
import numpy as np
# 生成 3 个形状为 2×3 的矩阵,满足标准正态分布
Y = np.random.randn(3, 2, 3)
print("*"*10 + " Y " + "*"*10)
print(Y)
# 生成全为1数组,维度与Y一样
X = np.ones_like(Y)
print("*"*10 + " X " + "*"*10)
print(X)
# X在内存中的地址
print("*"*10 + " X的地址 " + "*"*10)
print(id(X)) # id():引用对象在内存中的确切地址
X = X + Y
print("*"*10 + " X+Y " + "*"*10)
print(X)
# X=X+Y 在内存中的地址
print("*"*10 + " X的地址 " + "*"*10)
print(id(X))
运行结果:
X的 id() 在执行 X = X + Y 的前后发生改变,说明指向了不同的内存区域。
import numpy as np
# 生成 3 个形状为 2×3 的矩阵,满足标准正态分布
Y = np.random.randn(3, 2, 3)
print("*"*10 + " Y " + "*"*10)
print(Y)
# 生成全为1数组,维度与Y一样
X = np.ones_like(Y)
print("*"*10 + " X " + "*"*10)
print(X)
# X在内存中的地址
print("*"*10 + " X的地址 " + "*"*10)
print(id(X)) # id():引用对象在内存中的确切地址
X[:] = X + Y
print("*"*10 + " X+Y " + "*"*10)
print(X)
# X[:]=X+Y 在内存中的地址
print("*"*10 + " X的地址 " + "*"*10)
print(id(X))
运行结果:
X的 id() 在执行 X[:] = X + Y 前后没有改变,说明指向的是同一个内存区域。
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
暂无评论,快来写一下吧
展开评论