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)

NumPy基础知识-新手笔记_数组

NumPy基础知识-新手笔记_正态分布_02

NumPy基础知识-新手笔记_批处理_03

大数据拆分成多个批次:

  1. 得到数据集;
  2. 随机打乱数据;
  3. 定义批大小;
  4. 批处理数据集;

NumPy基础知识-新手笔记_正态分布_04

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))

运行结果:

NumPy基础知识-新手笔记_批处理_05

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个

运行结果:

NumPy基础知识-新手笔记_数组_06

NumPy基础知识-新手笔记_正态分布_07

NumPy基础知识-新手笔记_数组_08

              ...

NumPy基础知识-新手笔记_数组_09

节省内存

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))

运行结果:

NumPy基础知识-新手笔记_批处理_10

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))

运行结果:

NumPy基础知识-新手笔记_正态分布_11

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))

运行结果:

NumPy基础知识-新手笔记_正态分布_12

NumPy基础知识-新手笔记_正态分布_13

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))

运行结果:

NumPy基础知识-新手笔记_数组_14

NumPy基础知识-新手笔记_批处理_15

X的 id() 在执行 X[:] = X + Y 前后没有改变,说明指向的是同一个内存区域。



















好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695