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进行数据分析》,更多知识请阅读原书