Numpy是Python重要的基础,因此学好这部分是深度学习的基础。本节介绍如何用Numpy数据展开与合并,介绍ufunc对象(即通用函数),最后介绍一下方便广播机制(为不同shape的数组进行运算)。

数据合并与展开

深度学习和机器学习中,会经常遇到需要把多个向量或矩阵按某轴方向进行合并的情况。

在卷积或者循环神经网络中,在全连接层之前,需要矩阵展开。

合并一维数组

使用appenconcatenate函数来实现数组的合并。

import numpy as np
a=np.array([1,2,3])
b=np.array([4,5,6])
c=np.append(a,b)
print(c)
#或利用concatenate
d=np.concatenate([a,b])
print(d)

运行结果:

[1 2 3 4 5 6]
[1 2 3 4 5 6]

多维数组的合并

import numpy as np
T1=np.arange(4).reshape(2,2) 
T2=np.arange(4).reshape(2,2)

#查看生成的数据
print("T1 = ",T1)
print("T2 = ",T2)

#按行合并
c=np.append(T1,T2,axis=0)
print(c)
print("合并后数据维度",c.shape)

#按列合并
d=np.append(T1,T2,axis=1)
print("按列合并结果:")
print(d)
print("合并后数据维度",d.shape)

运行结果:

T1 = [[0 1]
[2 3]]
T2 = [[0 1]
[2 3]]
[[0 1]
[2 3]
[0 1]
[2 3]]
合并后数据维度 (4, 2)
按列合并结果:
[[0 1 0 1]
[2 3 2 3]]
合并后数据维度 (2, 4)

矩阵展开

reval函数默认是行序优先。功能是把多维数组转换成一维数组。

import numpy as np
nd15=np.arange(6).reshape(2,-1)
# 注意这里的-1是任意的意思。

print(nd15)
#按照列优先,展平。
print("按列优先,展平")
print(nd15.ravel('F'))

#按照行优先,展平。
print("按行优先,展平")
print(nd15.ravel())

运行结果:

[[0 1 2] 
 [3 4 5]]
按列优先,展平
[0 3 1 4 2 5]
按行优先,展平
[0 1 2 3 4 5]

Numpy通用函数

ufunc(通用函数)是universal function的缩写,它是一种能对数组的每个元素进行操作的函数。许多ufunc函数都是在c语言级别实现的,因此它们的计算速度非常快。此外,功能比math模块中函数更灵活。

Numpy几个常用通用函数

Python中使用向量化要比使用循环计算速度快得多。如果使用GPU,其性能将更强大,不过NumPy不提供GPU支持。TensorFlow提供GPU,后面将介绍TensorFlow如何使用GPU来加速算法。

import time
import numpy as np

x1 = np.random.rand(1000000)
x2 = np.random.rand(1000000)
##使用循环计算向量点积
tic = time.process_time()
dot = 0
for i in range(len(x1)):
    dot+= x1[i]*x2[i]
toc = time.process_time()
print ("dot = " + str(dot) + "\n for loop----- Computation time = " + str(1000*(toc - tic)) + "ms")

##使用numpy函数求点积
tic = time.process_time()
dot = 0
dot = np.dot(x1,x2)
toc = time.process_time()
print ("dot = " + str(dot) + "\n verctor version---- Computation time = " + str(1000*(toc - tic)) + "ms")

运行结果:

dot = 250056.79787921556
for loop----- Computation time = 468.75ms
dot = 250056.79787921355
verctor version---- Computation time = 0.0ms

for循环运行时间比使用向量运算运行时间慢很多。因此,在深度学习算法中,一般都使用向量化矩阵运算。

知识点补充:

time.process_time() 函数始终以秒为单位返回时间的浮点值。返回当前进程的系统和用户CPU时间之和的值(以秒为单位)。它不包括睡眠期间经过的时间。返回值的参考点是不确定的,因此仅连续调用结果之间的差有效。

广播机制

广播机制的功能是为了方便不同维度大小的array数据进行数学运算。

broadcasting可以这样理解:如果你有一个mXn的矩阵,让它加减乘除一个1Xn的矩阵,它会被复制m次,成为一个mXn的矩阵,然后再逐元素地进行加减乘除操作。同样地对m*1的矩阵成立.

举个例子:

import numpy as np

a=np.arange(10)
b=np.arange(10)

#两个shape相同的数组相加
print(a+b)
#一个数组与标量相加
print(a+3)
#两个向量相乘
print(a*b)

#多维数组之间的运算
c=np.arange(10).reshape([5,2])
d=np.arange(2).reshape([1,2])
#首先将d数组进行复制扩充为[5,2],如何复制请参考图1-2,然后相加。
print(c+d)

运行结果:

[ 0 2 4 6 8 10 12 14 16 18]
[ 3 4 5 6 7 8 9 10 11 12]
[ 0 1 4 9 16 25 36 49 64 81]
[[ 0 2]
[ 2 4]
[ 4 6]
[ 6 8]
[ 8 10]]

python的广播机制相加原理示意图

声明:内容来源于吴茂贵老师主编的学习教材《Python深度学习——基于TensorFlow》,本文仅供学习参考,并加入了博主自己的一些理解和操作,并非原汁原味,为了更好的阅读体验和系统性地学习,请购买正版读物进行学习。


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/DLNumpy2.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 24 日
如果觉得我的文章对你有用,请随意赞赏