学习笔记–numpy包
- expand_dims()函数
np.expand_dims(array,axis)#维度扩充
一维数组
a=np.array([1,2,3])
b=np.expand_dims(a,axis=0)
>>>b
[[1,2,3]]
c=np.expand_dims(a,axis=1)
>>>c
[[1],[2],[3]]
二维数组
a=np.array([[1,2,3],[4,5,6]])#a.shape=(2,3)
'''在最高维加括号,即最外层加括号'''
b=np.expand_dims(a,axis=0)#b.shape=(1,2,3)
>>>b
[[[1,2,3],[4,5,6]]]
c=np.expand_dims(a,axis=1)#c.shape=(2,1,3)
>>>c
[[[1,2,3]],[[4,5,6]]]
d=np.expand_dims(a,axis=2)#d.shape=(2,3,1)
>>>d
[[[1],[2],[3]],[[4],[5],[6]]]
- squeeze()函数
squeeze(a,axis=None)#从数组的形状shape中删除单维度条目,即把shape中为1的维度去掉
a=np.array([[[0,1,2,3,4,5,6,7,8,9]]])#a.shape=(1,1,10)
b=np.squeeze(a)#b.shape=(10,)
>>>b
array([0,1,2,3,4,5,6,7,8,9])
- numpy.ravel_multi_index()函数
用一个唯一的一维数来定位(保存)原数组的二维(或多维(i,j,k,…))的数对的信息。
index = np.ravel_multi_index((3, 4), (7, 6))#3*6+4=22
>>>index
22
arr = np.array([[3, 6, 6], [4, 5, 1]])#[3,6,6]为横坐标,[4,5,1]为纵坐标,即(3,4),(6,5),(6,1)三个坐标对
index = np.ravel_multi_index(arr, (7, 6))
print(index)
输出
[22 41 37]
- np.prod()函数
用来计算所有元素的乘积,对于有多个维度的数组可以指定轴,如axis=1指定计算每一行的乘积。
a = np.prod([1, 2])
b = np.prod([[1, 2], [3, 4]])
c = np.prod([[1, 2], [3, 4]], axis=1)
print(a)
print(b)
print(c)
输出
2
24
[ 2 12]
- np.unravel_index()
获取一个/组int类型的索引值在一个多维数组中的位置。
arr = np.array((3, 4))
index = np.ravel_multi_index(arr, (7, 6))
unravel_index = np.unravel_index(index, (7, 6))
print(index)
print(unravel_index)
输出
22
(3, 4)
- np.arange()函数
返回一个有终点和起点的固定步长的排列
a = np.arange(9)
b = np.arange(3,9)
c = np.arange(0,1,0.1)
print(a)
print(b)
print(c)
输出
[0 1 2 3 4 5 6 7 8]
[3 4 5 6 7 8]
[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
7, numpy.clip(a, a_min, a_max, out=None)[source]
将a限制在[a_min, a_max]之间
a = np.clip(np.random.normal(0, 3), -2, 2)
print(a)
b = np.array([-4,-3,-2,-1,0,1,2,3])
b = np.clip(b,-2,2)
print(b)
输出:
-2.0
[-2 -2 -2 -1 0 1 2 2]
numpy实现神经网络前向和反向传播
import numpy as np
# N是批量大小; D_in是输入维度;
# 49/5000 H是隐藏的维度; D_out是输出维度。
N, D_in, H, D_out = 64, 1000, 100, 10
# 创建随机输入和输出数据
x = np.random.randn(N, D_in)
y = np.random.randn(N, D_out)
# 随机初始化权重
w1 = np.random.randn(D_in, H)
w2 = np.random.randn(H, D_out)
learning_rate = 1e-6
for t in range(500):
# 前向传递:计算预测值y
h = x.dot(w1)
h_relu = np.maximum(h, 0)
y_pred = h_relu.dot(w2)
# 计算和打印损失loss
loss = np.square(y_pred - y).sum()
print(t, loss)
# 反向传播,计算w1和w2对loss的梯度
grad_y_pred = 2.0 * (y_pred - y)
grad_w2 = h_relu.T.dot(grad_y_pred)
grad_h_relu = grad_y_pred.dot(w2.T)
grad_h = grad_h_relu.copy()
grad_h[h < 0] = 0
grad_w1 = x.T.dot(grad_h)
# 更新权重
w1 -= learning_rate * grad_w1
w2 -= learning_rate * grad_w2