【pyTorch学习笔记②】Numpy基础·下篇
创始人
2025-05-30 00:01:49

本文参加新星计划人工智能(Pytorch)赛道: https://bbs.csdn.net/topics/613989052

文章目录

  • 五、Numpy算术运算
    • 1.元素对应相乘
    • 2.数组和标量运算
    • 3.点积(元素内积)
  • 六、数组变形
    • (一)改变形状
      • 1.reshape
      • 2.resize
      • 3.T(转置)
      • 4.ravel(展平)
      • 5.flatten
      • 6.squeeze
      • 7.transpose
    • (二)合并数组
      • 1.append
      • 2.concatenate
      • 3.stack
      • 4.hstack 、vstack 和 dstack
      • 5.vsplit 和 hsplit
  • 七、批量处理
  • 八、通用函数(ufunc)
  • 九、广播机制

五、Numpy算术运算

1.元素对应相乘

A = np.array([[1, 2], [-1, 4]])
B = np.array([[2, 0], [3, 4]])
print(A)
>>>[[ 1  2] [-1  4]]
print(B)
>>>[[2 0]   [3 4]] 
print(A*B)
>>>[[ 2  0] [-3 16]]
print(np.multiply(A,B))
>>>[[ 2  0] [-3 16]]

2.数组和标量运算

A = np.array([[1, 2], [-1, 4]])
print(A)
>>>[[ 1  2] [-1  4]]
print(A/2.0)
>>>[[ 0.5  1. ] [-0.5  2. ]]
print(A*2.0)
>>>[[ 2.  4.][-2.  8.]]

3.点积(元素内积)

X1 = np.array([[1,2],[3,4]])
X2 = np.array([[1,2,3],[4,5,6]])
X3 = np.dot(X1,X2)
print(X3)
>>>[[ 9 12 15][19 26 33]]

六、数组变形

在矩阵或者数组运算中,经常会遇到需要把多个向量或者矩阵按某轴方向合并、展开。比如,在卷积或循环神经网络中,在全连接层之前,需要把矩阵展平。

(一)改变形状

1.reshape

改变向量的维度,不修改向量本身

# reshape
arr = np.arange(10)
print(arr)
>>>[0 1 2 3 4 5 6 7 8 9]
# 将arr变换为2*5
print(arr.reshape(2,5))
>>>[[0 1 2 3 4][5 6 7 8 9]]
# 指定列数或行数,其他用-1代替
print(arr.reshape(5,-1))
>>>[[0 1][2 3][4 5][6 7][8 9]]
print(arr.reshape(-1,5))
>>>[[0 1 2 3 4][5 6 7 8 9]]

2.resize

改变向量的维度,且修改向量本身

# resize
arr = np.arange(10)
print(arr)
>>>[0 1 2 3 4 5 6 7 8 9]
# 将向量arr维度变换为2行5列
arr.resize(2,5)
print(arr)
>>>[[0 1 2 3 4][5 6 7 8 9]]

3.T(转置)

# T(转置)
arr = np.arange(12).reshape(3,4)
print(arr)
>>>[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]
print(arr.T)
>>>[[ 0  4  8][ 1  5  9][ 2  6 10][ 3  7 11]]

4.ravel(展平)

# ravel(展平)
arr = np.arange(6).reshape(2,-1)
print(arr)
>>>[[0 1 2][3 4 5]]
# 按列优先展平
print(arr.ravel('F'))
>>>[0 3 1 4 2 5]
# 按行优先展平
print(arr.ravel())
>>>[0 1 2 3 4 5]

5.flatten

把矩阵转换为向量

# flatten
a = np.floor(10*np.random.random((3,4)))
print(a)
>>>[[0. 0. 6. 8.][3. 1. 8. 8.][6. 4. 1. 8.]]
print(a.flatten())
>>>[0. 0. 6. 8. 3. 1. 8. 8. 6. 4. 1. 8.]

6.squeeze

用来降维的函数,把矩阵中含1的维度去掉。

arr = np.arange(3).reshape(3,1)
print(arr)
>>>[[0][1][2]]
print(arr.squeeze().shape)
>>>(3,)
arr1 = np.arange(6).reshape(3,1,2,1)
print(arr1.shape)
>>>(3, 1, 2, 1)
print(arr1.squeeze().shape)
>>>(3, 2)

7.transpose

对高危矩阵进行轴对换。如,把RGB改为GBR

arr = np.arange(24).reshape(2,3,4)
print(arr.shape)
>>>(2, 3, 4)
print(arr.transpose(1,2,0).shape)
>>>(3, 4, 2)

(二)合并数组

1.append

有axis参数,控制按行/按列合并,内存占用大。

# 合并一维数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.append(a,b)
print(c)
>>>[1 2 3 4 5 6]
# 合并多维数组
a = np.arange(4).reshape(2,2)
b = np.arange(4).reshape(2,2)
print(np.append(a,b,axis = 0))
>>>[[0 1][2 3][0 1][2 3]]
print(np.append(a,b,axis = 1))
>>>[[0 1 0 1][2 3 2 3]]

2.concatenate

a = np.arange(4).reshape(2,2)
b = np.arange(4).reshape(2,2)
print(np.concatenate((a,b),axis = 0))
>>>[[0 1][2 3][0 1][2 3]]
print(np.concatenate((a,b),axis = 1))
>>>[[0 1 0 1][2 3 2 3]]

3.stack

沿指定轴堆叠数组/矩阵
要求形状一样

a = np.arange(4).reshape(2,2)
b = np.arange(4,8).reshape(2,2)
print(np.stack((a,b),axis = 0))
>>>[[[0 1][2 3]][[4 5][6 7]]]
print(np.stack((a,b),axis = 1))
>>>[[[0 1][4 5]][[2 3][6 7]]]

4.hstack 、vstack 和 dstack

a = np.arange(4).reshape(2,2)
b = np.arange(4,8).reshape(2,2)
print(np.hstack((a,b)))
>>>[[0 1 4 5][2 3 6 7]]
print(np.vstack((a,b)))
>>>[[0 1][2 3][4 5][6 7]]
print(np.dstack((a,b)))
>>>[[[0 4][1 5]][[2 6][3 7]]]

5.vsplit 和 hsplit

按行和按列分割

a = np.arange(12).reshape(3,4)
print(a)
>>>[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]
print(np.vsplit(a,[1,2]))
>>>[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
print(np.hsplit(a,[1,2]))
>>>[array([[0],[4],[8]]), array([[1],[5],[9]]), array([[ 2,  3],[ 6,  7],[10, 11]])]

七、批量处理

一般步骤:
1.随机打乱数据
2.定义批大小
3.批处理数据

# 生成10000个形状为2*3的矩阵(一个10000*2*3形状的矩阵,第1维为样本数,后2维是数据)
data_train = np.random.randn(10000,2,3)# 打乱数据
np.random.shuffle(data_train)# 定义批大小
batch_size = 1000# 进行批处理数据
for i in range(0,len(data_train)//batch_size):x_batch_sum = np.sum(data_train[i:i+batch_size])print("第{}批次,该批次数据和为:{}".format(i+1,x_batch_sum))
>>>第1批次,该批次数据和为:19.831597230692044第2批次,该批次数据和为:25.740728092864465第3批次,该批次数据和为:27.055236935523748第4批次,该批次数据和为:33.117813938724495第5批次,该批次数据和为:25.877849245176712第6批次,该批次数据和为:28.51526070095471第7批次,该批次数据和为:23.45418417276757第8批次,该批次数据和为:29.85505288703944第9批次,该批次数据和为:32.270674668876第10批次,该批次数据和为:34.17904037831163

八、通用函数(ufunc)

许多ufunc函数都是由C语言编写,速度比较快。
比math灵活。math一般是标量,Numpy可以是向量和矩阵,减少了循环语句的使用。

函数名称功能
sqrt计算序列化数据的平方根
sin、cos三角函数
abs计算序列化数据的绝对值
dot矩阵计算(点积、向量内积)
log,log10,log2对数函数
exp指数函数
cumsum,cumproduct累计求和、求积
sum对序列化数据求和
mean计算均值
median计算中位数
std计算标准差
var计算方差
corrcoef计算相关系数
a = np.arange(10).reshape(2,5)
b = np.arange(-5,5).reshape(5,2)
print(a)
>>>[[0 1 2 3 4] [5 6 7 8 9]]
print(b)
>>>[[-5 -4][-3 -2][-1  0][ 1  2][ 3  4]]
print(np.sqrt(a))
>>>[[0.         1.         1.41421356 1.73205081 2.        ]      [2.23606798 2.44948974 2.64575131 2.82842712 3.        ]]
print(np.sin(a))
>>>[[0.         1.         1.41421356 1.73205081 2.        ]      [2.23606798 2.44948974 2.64575131 2.82842712 3.        ]]
print(np.cos(a))
>>>[[ 1.          0.54030231 -0.41614684 -0.9899925  -0.65364362] [ 0.28366219  0.96017029  0.75390225 -0.14550003 -0.91113026]]
print(np.abs(b))
>>>[[5 4][3 2][1 0][1 2][3 4]]
print(np.dot(a,b))
>>>[[ 10  20][-15  20]]
print(np.log2(a))
>>>[[      -inf 0.         1.         1.5849625  2.        ][2.32192809 2.5849625  2.80735492 3.         3.169925  ]]
print(np.exp(a))
>>>[[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+015.45981500e+01][1.48413159e+02 4.03428793e+02 1.09663316e+03 2.98095799e+038.10308393e+03]]
print(np.cumsum(a))
>>>[ 0  1  3  6 10 15 21 28 36 45]
print(np.cumproduct(a))
>>>[0 0 0 0 0 0 0 0 0 0]
print(np.sum(a))
>>>45
print(np.mean(a))
>>>4.5
print(np.median(a))
>>>4.5
print(np.std(a))
>>>2.8722813232690143
print(np.var(a))
>>>8.25
print(np.corrcoef(a))
>>>[[1. 1.][1. 1.]]

九、广播机制

Numpy的Universal functions中要求输入的数组shape是一致的,当不一致时,就要用到广播机制。
有以下规则:
(1)向shape最长的数组看齐,不足补1;
(2)取各轴的最大值
(3)输入数组的某个轴和输出数组的对应轴的长度相同或者为1时,用来计算,否则,出错。
(4)当输入数组的某个轴的长度为1时,沿着此轴的运算都用第一组值。

a = np.arange(0, 40, 10).reshape(4, 1)
b = np.arange(0, 3)
c = a+b
print(a)
>>>[[ 0][10][20][30]]
print(b)
>>>[0 1 2]
print(c)
>>>[[ 0  1  2][10 11 12][20 21 22][30 31 32]]

根据规则2,输出应该是4*3
根据规则4,a应为:[[ 0 1 2] ,b应为:[[ 0 0 0]
[ 0 1 2] , [10 10 10]
[ 0 1 2] , [20 20 20]
[ 0 1 2]] , [30 30 30]]

相关内容

热门资讯

cad打印线条粗细设置 cad... 004-线型(下)打印样式设置和线型文件使用一、线宽设置方法制图规范里边的线宽要求,我们已经定义好,...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...