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

Python中Numpy的基础知识(1)

健谈始于戊戌年 2021-07-01
1503
Numpy是Python中科学计算的核心库。它可以对多维度的矩阵展开高效计算。如果对Matlab比较熟悉,那么掌握Numpy并不难。我们来介绍一下Numpy的基本功能。

 

1. 数组(Array)


我们先来回顾一下数组。数组是类型相同的一组值。数组中的每个元素用一个非负的数值标记。数组有维数(Rank),有1维数组,2维数组以及多维数组。Numpy 创建的数组都有一个形状(shape)属性,它是一个元组,返回各个维度的维数。

 

当需要使用Numpy的时候,首先要引用它:

import numpy as np

 

我们可以用Python中的list定义一个数组:

a = np.array([1, 2, 3])   # 创建1维数组

 

接下来,我们可以看一下数组a的类型(type)和形状(shape):

print(type(a))

<type 'numpy.ndarray'>

 

print(a.shape)

(3,)

 

我们可以查看数组中的每个元组。注意在Numpy Array中,第一个元素从0开始。

print(a[0], a[1], a[2])

 

你还可以修改数组中的元素

a[0] = 5

 

修改完了以后,数组a不一样了:

print(a)

[5, 2, 3]

 

Numpy还有一些创建特殊数组的函数。例如zeros(),ones()等等。如果要新建一个2行2列的0矩阵,就可以用到下面的命令:

a = np.zeros((2,2))

print(a)

[ 0.  0.]

[ 0.  0.]

 

或者新建一个2行2列,但是所有元素都等于1的矩阵:

b = np.ones((2,2))

print(b)

[1. 1.]

[1. 1.]

 

或者新建一个所有元素都为任意常数的矩阵:

c = np.full((2,2), 7)

print(c)               

[ 7.  7.]

[ 7.  7.]

 

也可以新建一个单位矩阵

d = np.eye(2)

print(d)              

[ 1.  0.]

[ 0.  1.]

 

或者新建一个元素为随机数的矩阵:

e = np.random.random((2,2))

print(e)                    

[ 0.91940167  0.08143941]

[ 0.68744134  0.87236687]

由于是随机数,每次运行程序输出的值会不同。

 

2. 数组的标志(Indexing)


在了解了数组的基本知识以后,我们来介绍Numpy中几种标记数组的方式。

 

2.1切片(Slicing)


同Python的数列(List)类似,Numpy中的数组可以被切片。如果对多维数组切片,需要对每一个维度的数组分别切片。我们通过例子来说明:

 

我们先新建一个2维数组

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])


这是一个3行4列的数组

[[ 1,  2,  3,  4],

[ 5,  6,  7,  8],

[ 9, 10, 11, 12]]

 

我们从中取出前2行的第1列和第2列,形成一个新的2行2列的数组:

b = a[:2, 1:3]

[[2, 3],

[6, 7]]

 

需要指出,新数组b的元素和原数组a的元素是一样的。所以,修改数组b中的数据,也就会修改数组a中的数据。我们来看下面的例子。


在原数组a中,0行1列的值为2

print(a[0, 1])

2

 

我们修改新数组b中的数据。把它的0行0列的值改为88

b[0, 0] = 88

 

那么数组a中的数据也发生了变化

print(a[0, 1])

88

 

我们还可以混合使用整数标记和切片标记。但是这样产生新数组的维数要低于原数组。这同一点Matlab不同。我们继续看数组a

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

 

有两种方法获取数组a的中间行。混合使用整数标记和切片标记,会降低数组的维度。单独使用切片标记不会降低数组的维度。

row_r1 = a[1, :]    # 1维

array([5, 6, 7, 8])

 

row_r2 = a[1:2, :]  # 2维

array([[5, 6, 7, 8]])

 

row_r1是1维数组,有4个元素。

print(row_r1, row_r1.shape)  

[5 6 7 8] (4,)

 

row_r2是2维数组,包括1行4列。

print(row_r2, row_r2.shape)  

[[5 6 7 8]] (1, 4)

  

2.2整数数组标志


当我们使用切片时,产生的数组是原有数组的子数组。但是整数数组标志可以让我们新建任意的数组。我们来看一个例子。

 

我们先生成一个3行2列的数组a:

a = np.array([[1,2], [3, 4], [5, 6]])

[[1, 2],

[3, 4],

[5, 6]]

 

输入下面的命令,

print(a[[0, 1, 2], [0, 1, 0]])

会得到:

[1 4 5]

这是为什么呢?

 

这就是整数数组标志。它等同于

print(np.array([a[0, 0], a[1, 1], a[2, 0]]))

也就是返回0行0列,1行1列,2行1列的值。

 

当使用整数数组标志时,我们还可以重复调用原数组中的元素

print(a[[0, 0], [1, 1]])

[2 2]

 

上面的命令两次调用0行1列的元素2。它等同于以下的命令:

print(np.array([a[0, 1], a[0, 1]]))

[2 2]

 

2.3布尔数组标志


我们可以利用布尔数组标志从数组中选出任意的元素。通常,我们是为了选出符合某些条件的元素。来看下面的例子。

 

我们还是先定义一个数组a

a = np.array([[1,2], [3, 4], [5, 6]])

 

我们想找到数组a中大于2的元素:

bool_idx = (a > 2)

 

但是这次返回的是布尔型变量

print(bool_idx)

[[False False]

 [ True  True]

 [ True  True]]

 

我们可以用布尔数组指标构建一个满足条件的1维数组

print(a[bool_idx])

[3 4 5 6]

 

当然,我们也可以写一行简单的代码实现以上功能:

print(a[a > 2])   

[3 4 5 6]


Numpy的功能还有很多,例如数据类型、数组计算、数组广播。我们以后会继续介绍。

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

评论