【pyTorch学习笔记②】Numpy基础·下篇

五、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

按行和按列分割

扫描二维码关注公众号,回复: 15880326 查看本文章
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.8315972306920442批次,该批次数据和为:25.7407280928644653批次,该批次数据和为:27.0552369355237484批次,该批次数据和为:33.1178139387244955批次,该批次数据和为:25.8778492451767126批次,该批次数据和为:28.515260700954717批次,该批次数据和为:23.454184172767578批次,该批次数据和为:29.855052887039449批次,该批次数据和为:32.27067466887610批次,该批次数据和为: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+01
  5.45981500e+01]
 [1.48413159e+02 4.03428793e+02 1.09663316e+03 2.98095799e+03
  8.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]]

相关推荐

【pyTorch学习笔记①】Numpy基础·上篇
【pyTorch学习笔记②】Numpy基础·下篇

猜你喜欢

转载自blog.csdn.net/qq_46319397/article/details/129548201