numpy是Python用来做科学计算和数据分析的工具包,它具备以下特点:
numpy首先是一个多维数组,有丰富的API对多维数组进行各种矢量运算。 具备强大的“广播”能力,实现标量或低维数组与高维数组之间进行运算。 包含大量科学运算的API,例如线性代数、傅里叶变换等 不用编写循环,可以对整块数值进行标准的数学运算 这些特点,在随后的代码讲解中就可以体会到。%matplotlib inline
from numpy.random import randn
import numpy as np
np.set_printoptions(precision=4, suppress=True) # 设置屏幕输出的格式,精度,小数点后保留的位数
1. NumPy多维数组
1.1 多维数组的创建
arr1 = randn(2, 3) #用numpy提供的随机数组生成器,生产一个多维数组
arr1
用Python内置的type()方法,看出刚才产生的是一个numpy的数组对象
type(arr1)
调用numpy对象内置的shape属性,可以获得数组的维度。
arr1.shape
调用numpy对象内置的dtype属性,可以获得数组元素的数据类型
arr1.dtype
还可以把前面学过的列表list对象,转换为numpy多维数组。numpy数组和list的不同,在于numpy数组元素的数据类型是相同的,都是整型、浮点型或字符串型;而list的元素可以是各种不同类型的数据。
一个list中,包含整形和浮点型数据。转换为numpy数组后,元素都变成了浮点型。
lst1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(lst1)
arr1
arr1.dtype
元素都是整数的list,转换为numpy数组,元素都是整型。
lst2 = [[1, 2, 3, 4], [5, 6, 7, 8]] # 注意双重中括号
arr2 = np.array(lst2)
arr2
arr2.dtype
arr2.ndim
其他创建多维数组的方法
np.zeros(10) #全0一维数组
np.zeros((2, 3)) #全0二维数组,注意参数是一个元组
np.zeros((2, 3, 4)) #全0三维数组,注意参数是一个元组
np.ones((2, 3)) #全1数组
np.arange(15) # arange是Python range函数的数组版,返回数组而不是列表
arr = np.empty((2,3)) # empty方法创建一个空数组(分配了一块内存空间),在没有赋值前,其元素是随机的无效数值。
arr[:] = 99
arr
1.2 数组的数据类型
创建数组时,可以指定元素的数据类型
arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)
arr1.dtype, arr2.dtype
arr1
arr2
1.3 数组与数组、数组与标量间的基本运算
NumPy数组与标量之间的运算,体现了前面提到的“广播”机制,会把运算传播到整个数组,不用编写循环
arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
arr1
1 / arr1
arr1 * 2
形状相同的数组之间的简单运算,就是对应元素的运算,不用编写循环。
arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
arr2 = np.array([[4, 5, 6], [1, 2, 3]])
arr1 + arr2
arr1 - arr2
arr1 * arr2
arr1 / arr2
numpy数组与低维数组间的运算,也体现了广播机制,巧妙地把运算传播到整个数组,不用编写循环
arr3 = np.arange(3)
arr3
arr1 + arr3
arr1 * arr3
注意,这里的数组之间的乘法,与线性代数中矩阵的乘法不同。后面有专门的章节介绍“线性代数”
arr4 = np.array([[1],[2]])
arr4
arr1 - arr4
1.4 数组的索引和切片
1.4.1 一维数组
一维数组的索引和切片,跟Python的列表list的方法类似。
arr1 = np.arange(10)
arr1
arr1[5]
arr1[5:8]
数组的切片是源数组的视图,没有产生一个新的副本,对切片的修改,会直接反映在源数组。
ar2 = arr1[5:8]
arr2[1] = 12345
arr2
arr2[:] = 64 # 对数组的切片赋值,符合数组的广播特性
arr1
如果要把数组的切片产生新副本,需要调用copy()方法
arr3 = arr1[1:4].copy()
arr3[:] = 99
arr1 #没有对源数组产生改变
1.4.2 二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d
二维数组的索引顺序是:先行后列。如果只指定一个维度,就是行。
读取二维数组的行
arr2d[2]
行+列的索引,读取某个元素
arr2d[0][2]
arr2d[0, 2] # 两种索引方法等价
冒号的使用,与list列表类似
arr2d[:2]
arr2d[:2 , 1:]
arr2d[1 , :2]
arr2d[:2, 1]
获取某个列或某几个列
arr2d[: , :1]
arr2d[: , :2]
1.5 布尔型索引
布尔型索引,是指通过一个条件判断,来选取数组中元素的方法。
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d
用一个布尔型列表,选取数组的元素
arr2d[[True, False, True]]
选取数组中所有大于3的元素
arr2d[arr2d>3]
1.6 花式索引
花式索引是用一个整数数组,对另一个数组进行索引。
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d
用数组[2,0]选取到的是第2行第0行,而且,第2行排前面
arr2d[[2,0]]
用数组[-1,2]选取到的是两个第2行,因为-1相当于第2行。这个原理在前面讲列表的时候就说过了,-i相当于“长度-i”。
arr2d[[-1,2]]