接上文:
3. 数据类型
在Numpy数组中,每一个元素都具有相同的类型。同时,Numpy为我们构建数组提供了大量数据类型。当我们创建数组时,Numpy会猜测我们需要的数据类型,但是我们最好还是明确数据类型。
我们来通过几个例子说明数据类型。当然,我们还是要先调用Numpy:
import numpy as np
我们先看看Numpy是怎么自动对数据分类的,定义数组x:
x = np.array([1, 2])
Numpy认为数组中的元素是整型32位:
print(x.dtype)
int32
如果把1写成1.0,2写成2.0,那么Numpy认为数组中的元素是浮点64位:
x = np.array([1.0, 2.0])
print(x.dtype)
float64
如果我们要自己定义数据的类型,可以这样写:
x = np.array([1, 2], dtype=np.int64)
这次数组x中的数据类型为int64
print(x.dtype)
int64
4. 数组的计算
在新建了数组以后,我们通常需要做一些计算,例如加减乘除四则运算等。我们来看看Numpy是如何实现这些计算的。
我们先定义两个数组x和y。它们都是64位浮点型。
import numpy as np
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)
以下两种方法实现数组的加法:
print(x + y)
print(np.add(x, y))
它们都可以得到以下的结果:
[[ 6. 8.]
[10. 12.]]
同样,数组相减也有两种方法:
print(x - y)
print(np.subtract(x, y))
返回值位:
[[-4. -4.]
[-4. -4.]]
数组的乘法也类似:
print(x * y)
print(np.multiply(x, y))
可以得到:
[[ 5. 12.]
[21. 32.]]
还有数组的除法:
print(x y)
print(np.divide(x, y))
返回值为:
[[0.2 0.33333333]
[0.42857143 0.5 ]]
除了四则运算,我们还可以进行数组的开方:
print(np.sqrt(x))
可以得到数组x中每个元素的平方根:
[[1. 1.41421356]
[1.73205081 2. ]]
以上数组运算的内容一目了然。我们还需要重点介绍一下矩阵乘法,也就是内积(Inner product)。我们来复习以下内积。内积也叫做点积。两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的内积定义为:
a·b=a1b1+a2b2+……+anbn
所以,如果我们新建数组v和w
v = np.array([9,10])
w = np.array([11, 12])
那么,它们的内积为9*11+10*12=219。Numpy的内积算法如下:
print(v.dot(w))
print(np.dot(v, w))
219
我们可以用两种方法计算矩阵x和数组v的内积
print(x.dot(v))
print(np.dot(x, v))
它们都会得到:
[29 67]
[29 67]
当然,我们还可以计算矩阵x和矩阵y的内积
print(x.dot(y))
print(np.dot(x, y))
可以得到新的矩阵
[[19 22]
[43 50]]
注:矩阵x为
[[1, 2],
[3, 4]]]
矩阵y为
[[5, 6],
[7, 8]]
矩阵x和y内积的算法如下:
[[1*5+2+7=19,1*6+2*8=22],
[3*5+4*7=43,3*6+4*8=50]]
Numpy中还有一些数组计算的函数,最常用的是sum。
对于数组x:
x = np.array([[1,2],[3,4]])
[[1, 2],
[3, 4]]]
我们可以计算数组x中所有元素的值
print(np.sum(x))
10
也可以计算每一列的值
print(np.sum(x, axis=0))
[4 6]
或者计算每一行的值
print(np.sum(x, axis=1))
[3 7]
最后,我们在来介绍一下转置矩阵。所谓转置矩阵,就是把矩阵的行类互换后的新矩阵。如何利用Numpy实现矩阵转置呢?
来看矩阵x
x = np.array([[1,2], [3,4]])
[[1 2]
[3 4]]
要对矩阵x转置,可以用下面的方法:
print(x.T)
[[1 3]
[2 4]]
5. 数组的广播
我们有时需要对不同维度的数组进行运算。比方说我们可能需要用一个常数同一个数组相加,或者是一个小矩阵同一个大矩阵相加。这时就需要用到数组的广播功能。
我们来举例说明这个问题。首先,我们还是先定义3个数组x,v和y。
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
[[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]]
v = np.array([1, 0, 1])
[1, 0, 1]
数组y和x的形状相同,但是没有数值。
y = np.empty_like(x)
如果我们想把数组v和x相加,可以用循环的办法:
for i in range(4):
y[i, :] = x[i, :] + v
这样就可以得到y
[[ 2, 2, 4],
[ 5, 5, 7],
[ 8, 8, 10],
[11, 11, 13]]
尽管这种做法可以实现我们的目标,但是如果数组x非常大,计算速度就会很慢。Numpy的广播功能可以轻松解决这个问题。
同样是数组x和v
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
利用广播功能,将数组v同x的每一行相加。用一行代码实现上面程序的循环功能。
y = x + v # Add v to each row of x using broadcasting
print(y)
[[ 2 2 4]
[ 5 5 7]
[ 8 8 10]
[11 11 13]]
尽管数组x为4行3列,数组v为3行一列。利用广播功能,y=x+v的命令依旧有效。
Next>> 我们会介绍Python中的Scipy!




