1 初识numpy
1.1定义
是 Numerical Python 简称,它是python数值计算最为重要的基础包,基于numpy的科学函数功能,将numpy的数值对象作为数据交换的通用语
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
(1)ndarray,高效多维数组,基于数组计算及广播功能函数
(2)对硬盘中数组数据进行读写的工具,并对内存映射文件进行操作
(3)用numpy连接 C/C++/Fortran语言类库的c语言API
将数据传给底层语言编写的外部类库,再将计算结果按照numpy的方式返回
(4)线性代数、傅里叶变换、随机数生成等功能
1.2 numpy重要的主要原因
(1)numpy在内部将数据储存在连续的内存块之上,其算法库是c语言写的,内存量小于python的其他内建的序列
(2)可针对全量数组进行复杂计算
1.3 举例验证
import numpy as np my_arr = np.arange(1000000) my_list = list(range(1000000)) %time for _ in range(10): my_arr2 = my_arr * 2 # %time返回运行时间,_ 为占位符 %time for _ in range(10): my_list2 = [x * 2 for x in my_list]
numpy计算要比python正常计算快10-100倍,且占的内存更少
2 核心特征 ndarray: 多维数组对象
2.1 定义
ndarray是大型数据集容器,数组允许使用类似于标量的操作语法在整块数据上进行数据计算
包括的每一个元素均为相同类型
当看到“数组”、“numpy数组”或ndarray,均表示同一个ndarray对象
2.2 牛刀小试
import numpy as np # Generate some random data data = np.random.randn(2, 3) data data * 10 data + data data.shape data.dtype
2.3 生成ndarray
(1)生成数组最简单的方式就是使用array函数,接受任意序列型对象,举例:
import numpy as np data1 = [6, 7.5, 8, 0, 1] arr1 = np.array(data1) arr1 data2 = [[1, 2, 3, 4], [5, 6, 7, 8]] arr2 = np.array(data2) arr2 arr2.ndim arr2.shape arr1.dtype arr2.dtype
(2)创建初始化数组
np.zeros(10) np.zeros((3, 6)) np.empty((2, 3, 2))
(3)创建有数据的数组
np.arange(15)
2.4 ndarray的数据类型
数据类型,即dytpe,包含了ndarray的元数据
(1)指定类型创建数组 dtype
arr1 = np.array([1, 2, 3], dtype=np.float64) arr2 = np.array([1, 2, 3], dtype=np.int32) arr1.dtype arr2.dtype
(2)显式地转换数组的数据类型 astype
使用astype时,总是生成一个新的数组
arr = np.array([1, 2, 3, 4, 5]) #创建数组 arr.dtype #int类型 float_arr = arr.astype(np.float64) #显式int转成float类型 float_arr.dtype arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1]) arr arr.astype(np.int32) #显式float转成int类型 numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_) numeric_strings.astype(float) #显式string转成float类型
注意:numpy数组使用字符串类型时,会修正它的大小或删除输入且不发出警告
int_array = np.arange(10)#int类型 calibers = np.array([.22, .270, .357, .380, .44, .50], dtype=np.float64) #float类型 int_array.astype(calibers.dtype) #a变量的类型转成b变量的类型 empty_uint32 = np.empty(8, dtype='u4') empty_uint32
3 numpy 数组算术
数组允许批量操作而无须for循环,即为特性向量化
任何等尺寸数组之间的算术操作都应用了逐元素操作的方式
arr = np.array([[1., 2., 3.], [4., 5., 6.]]) arr arr * arr #带有标量的算术操作,会把计算参数传递给数组的每一个元素 arr - arr 1 / arr arr ** 0.5 arr2 = np.array([[0., 4., 1.], [7., 2., 12.]]) arr2 arr2 > arr #比较数组 会生成布尔数组 不同尺寸的数组操作,将会用到广播特性
4 索引与切片
4.1 多维数组取值
索引从0开始,包前不包后(结束索引值不包括)
numpy数组的索引,取数据的子集或某个单个元素,数组的切片是原数组的视图,说明子集数组并不是被复制了,任何对于视图的修改都会反映到原数组上
一维数组取值 arr[起始索引值:结束索引值]
arr = np.arange(10) arr arr[5] #取固定位置数据 arr[5:8] #取5-8索引的切片 arr[5:8] = 12 #将5-8索引位置的数据,重新赋值 arr arr_slice = arr[5:8] arr_slice #重新取出原数组,结果是已修改后的 arr_slice[:] = 64 #子数组重新赋值,也反映在原数组,[:] 无指定的起始和结束索引,则就全部取出 arr 二维数组取值 arr[起始索引值1:结束索引值1,起始索引值2:结束索引值2] 在二维数组中,每个索引值对应的元素不是一个值,而是一个数组 arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) #定义二维数组 arr2d[2] #取第3个的整个一维数组 arr2d[0][2] #锁定唯一数组的方式一 arr2d[0, 2] #锁定唯一数组的方式二 arr2d[0:2, 0:3] #取多维数组的值 三维数组取值 以下返回的数组都是视图 arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) arr3d arr3d[0] #取出的是2x3的数组 old_values = arr3d[0].copy() arr3d[0] = 42 #取出重新赋值 arr3d arr3d[0] = old_values arr3d arr3d[1, 0] #取出的是一维的数组 x = arr3d[1] #分步取出二维数组 x x[0] #分步取出一维数组
4.2 布尔索引
使用布尔值索引选择数据时,生成的数据是拷贝的,原数组不发生改变,布尔数组
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe']) data = np.random.randn(7, 4) #产生随机行7和列4的数组 names data names == 'Bob' #轮询判断数组中的值是否等于'Bob',返回判断结果的布尔数组 data[names == 'Bob'] #轮询返回的布尔数组,当为true时,返回对应位置的一维数组 data[names == 'Bob', 2:] #同上,返回一维数组时,截取其一维数据的子集片段 data[names == 'Bob', 3] names != 'Bob' data[~(names == 'Bob')] #~ 指数值取反的数值 cond = names == 'Bob' #赋值给变量 data[~cond] mask = (names == 'Bob') | (names == 'Will') #还可以多个条件判断,返回判断结果的布尔数组 mask data[mask] data[data < 0] = 0 #本身数值判断,再返回当为true时的数值 data data[names != 'Joe'] = 7 #满足条件的重新赋值 data
4.3 神奇索引
索引数组,指定多维数组的位置索引
arr = np.empty((8, 4)) #预定义多维空数组 for i in range(8): arr[i] = i #多维数组赋值 arr arr[[4, 3, 0, 6]] #据多维数组的索引一维数组位置,取值 arr[[-3, -5, -7]] arr = np.arange(32).reshape((8, 4)) arr arr[[1, 5, 7, 2], [0, 3, 1, 2]] #据多维数组的索引,取值 arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
5 数组转置和换轴
转置是一种特殊的数据重组形式,可返回底层数据的视图,不复制,数组拥有transpose方法,也有特殊的T属性
arr = np.arange(15).reshape((3, 5)) #定义有值范围的,固定行列数组 arr arr.T #转置数组 arr = np.random.randn(6, 3) #定义随机数,固定行列数组 arr np.dot(arr.T, arr) #计算数组内的点积 dot(a,b) a的行乘以b的列的和 arr = np.arange(16).reshape((2, 2, 4)) arr arr.transpose((1, 0, 2)) #指x轴和y轴置换(三维数组:x、y、z轴的置换) transpose(1,0,2): 表示X轴与Y轴发生变换之后 transpose(0,2,1):表示Y轴与Z轴发生轴变换之后 transpose(2,1,0):表示X轴与Z轴发生轴变换之后 arr arr.swapaxes(1, 2)
本篇知识点参考《利用python进行数据分析》,更多知识请阅读原书