3.Numpy的一些容易忘记的知识点
一、Numpy的基本运算
- numpy数组转换成标量scaler的list
import numpy as np
a = np.random.randn(3, 2)
print(a)
print(list(a))
print(list(map(list, a)))
[[ 0.5310127 1.8482319 ]
[-1.54645326 -0.71086787]
[ 0.39379521 1.17247948]]
[array([0.5310127, 1.8482319]), array([-1.54645326, -0.71086787]), array([0.39379521, 1.17247948])]
[[0.5310126955059437, 1.8482319005660728], [-1.5464532601176755, -0.7108678725740409], [0.39379520685685043, 1.1724794753885714]]
- numpy常见用法
import torch
import numpy as np
# 向量的加减法
a = np.array([1, 2]) # array
b = np.array([3, 4]) # array
print(a + b) # +
print(a - b) # -
print(a * b) # 数乘
print(a / b) # /
print(a.dot(b)) # 点乘,是一个标量
print(np.dot(a, b)) # 同上
print(a@b) # 向量的内积,一个标量
# 矩阵的计算
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a.dot(b)) # 是矩阵,则为矩阵乘法
print(np.dot(a, b))
print(a@b)
print(np.linalg.det(a)) # 求行列式的,这里精度有点问题
print(np.linalg.inv(a)) # 求矩阵的逆
二、常用的矩阵变换
import torch
# 矩阵形状变换
a = torch.arange(12).reshape(3, 4) # 生成0-11的数据,并进行形状变换
b = torch.arange(12).view(3, 4) # 同上
print(a)
# print(b)
c = a.T # 矩阵的转置
d = a.t() # 同上
print(c)
print(d)
三、Numpy与其他包的转换
- 与Image的转换
a = np.random.randn(14,14,3)
img = Image.from_numpy(a)
img.show()
- 与Pytorch转换成tensor
import numpy as np
import torch
# numpy 与 torch之间的相互转换
a = np.array([1, 2]) # array
b = torch.tensor(a, dtype=torch.float64) # 从numpy转成torch
print(a)
print(b)
c = torch.from_numpy(a) # 从numpy转成torch
print(c)
d = c.numpy() # 从torch转换成numpy
print(d)
四、Numpy的类型
import numpy as np
import torch
a = np.array([1., 2.], dtype=np.float32) # 转成float32
a = a.astype(np.float64) # 转成float64
a = torch.tensor([1., 2.], dtype=torch.float32) # 转成float32
print(a.shape)
五、最小二乘法实现
github上看到的,很久了,忘记是哪个了
import math
import random
import torch
import matplotlib.pyplot as plt
def sigmoid(x):
return 1 / (1 + math.exp(-x))
def mish(x):
return x * math.tanh(math.log(1 + math.exp(x)))
if __name__ == '__main__':
_x = [i / 100 for i in range(100)]
_y = [4 * j + 3 for j in _x]
print(_x)
print(_y)
w = random.random()
b = random.random()
plt.ion()
for epoch in range(100000):
for x, y in zip(_x, _y):
y = sigmoid(y)
z = sigmoid(w * x + b)
loss = 1 / 2 * (z - y)**2
# dw = 1.0*x*(1/(math.exp(-b - w*x) + 1) - 1/(1 + math.exp(-y)))*math.exp(-b - w*x)/(math.exp(-b - w*x) + 1)**2
# db = 1.0*(1/(math.exp(-b - w*x) + 1) - 1/(1 + math.exp(-y)))*math.exp(-b - w*x)/(math.exp(-b - w*x) + 1)**2
dw = (z-y)*z*(1-z)*x
db = (z-y)*z*(1-z)
w = w - 2.3 * dw
b = b - 0.4 * db
print("w:{}, b:{}, loss: {}".format(w, b, loss))
plt.clf()
plt.plot(_x, _y, 'r')
v = [w * i + b for i in _x ]
plt.plot(_x, v, "b")
plt.pause(0.0001)
plt.ioff()
六、总结
- numpy的使用时比较多的,这些都是一些容易忘记的,作为一个字典查询