暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python十二钗之Numpy(2)

健谈始于戊戌年 2021-07-01
754

接上文:

Python中Numpy的基础知识(1)


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!

文章转载自健谈始于戊戌年,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论