1. 数组(Array)
当需要使用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的功能还有很多,例如数据类型、数组计算、数组广播。我们以后会继续介绍。




