numpy库的用途实在太广了,最近研究生新生开学,准备做一个新生的大数据分析,所以学习一下数据分析。在此总结学习笔记。
本教程大体上按照学习数据结构的方式,按照增删改查的顺序编写,以便自己复习时用,以后用到再补充。本目录格式,与思维导图保持一致,修改文档记得同步思维导图!
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。
快速,方便,科学计算的基础库
NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray。我们可以使用 array() 函数创建一个 NumPy ndarray 对象。
创建一个指定数组
t1 = np.array([1,2,3])
快速生成指定数组
arr = np.array(range(10))#快速生成0-9的数组
arr =np.arange(10)#快速生成0-9的数组
a = np.arange(10,20,2)#10-20 步长为2
a = np.arange(12).reshape((3,4))#0-11调整数组大小3行4列
a = np.linspace(1,10,6).reshape((2,3))#从1-10平均分6段
生成随机小数
arr = np.array([random.random() for i in range(10)])#利用random生成numpy中的小数
保留小数位
t8 = np.round(t7,2)#保留2位小数
创建一个指定的二维数组
array = np.array([[1,2,3],[2,3,4]])
创建一个指定的三维数组
t3 =np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
查看数组的形状
print(t3.shape)#查看数组的形状
检查数组的维数
print(a.ndim) #检查数组的维数
修改数组形状
t4 = t2.reshape(3,2)#修改数组形状
查看元素个数
print('size',array.size)#元素个数
展开数组
newarr = arr.flatten()#展开数组,二维变一维
newarr = arr.reshape(-1)#展开数组,二维变一维
创建指定维数的数组
arr = np.array([1, 2, 3, 4], ndmin=5)#创建一个有 5 个维度的数组
print(t4.dtype)#检查数组的数据类型
arr = np.array(range(1,4),dtype="float32")#numpy中的数据类型
arr = np.array([1,1,0,1,0,0],dtype=bool)#numpy中的bool类型
t6 = t5.astype("int8")#调整数据类型
ValueError:在 Python 中,如果传递给函数的参数的类型是非预期或错误的,则会引发 ValueError。
转换已有数组的数据类型
newarr = arr.astype('i')#复制新数组并转换为int
随机数并不意味着每次都有不同的数字。随机意味着无法在逻辑上预测的事物。
生成随机整数
from numpy import random
x = random.randint(100)#0-100之间的随机整数
x=random.randint(100, size=(5))#生成一个 1-D 数组,其中包含 5 个从 0 到 100 之间的随机整数
x = random.randint(100, size=(3, 5))#生成有 3 行的 2-D 数组,每行包含 5 个从 0 到 100 之间的随机整数
生成随机浮点数
x = random.rand()#0-1之间随机浮点数
x = random.rand(5)#生成包含 5 个随机浮点数的 1-D 数组
x = random.rand(3, 5)#生成有 3 行的 2-D 数组,每行包含 5 个随机数
从数组生成随机数
x = random.choice([3, 5, 7, 9])#返回数组中的值之一
.seed(s)#随机数种子
t.T
t.transpose()
t.swapaxes(1,0)数组索引
arr = np.array([61, 62, 63, 64, 65]) x = [True, False, True, False, True] newarr = arr[x] #过滤掉false的元素
arr = np.array([61, 62, 63, 64, 65]) filter_arr = arr > 62 newarr = arr[filter_arr]#直接从数组创建过滤器
for x in np.nditer(arr): print(x)#迭代输出数组的每一个值
for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S'])#以字符串形式遍历数组
for x in np.nditer(arr[:, ::2]):#每遍历 2D 数组的一个标量元素,跳过 1 个元素
for idx, x in np.ndenumerate(arr): print(idx, x)#枚举以下 1D 数组元素(带索引迭代)
A = np.arange(3,15).reshape(3,4)
for row in A:
print(row)#迭代每一行,按行输出
for column in A.T:
print(column)#迭代每一列。用.T转置 行变列
访问 1-D 数组
print(arr[0])#访问第一个元素
print(arr[1])#访问第二个元素
访问 2-D 数组
t[2,3]#访问3行4列元素
访问 3-D 数组
print(arr[0, 1, 2])#访问第一个数组的第二个数组的第三个元素
布尔索引
t[t>10]=10
选择行
t[2]#第二行
t[2:]#第二行及以后
t[3:,:]第三行及以后
选择列
t[:,4:]
选择行列
连续的多行
t[2:,:3]#3行后,3列前
b = t2[2:5,1:4]#取多行和多列,取第三行到第五行,第二列到第四列的结果
不连续
c = t2[[0,2,2],[0,1,3]] # 00 21 23
t[[1,3],[2,4]]#选择的是(1,2)(3,4)两个位置的值
STEP裁剪步长
print(arr[1:5:2])从索引 1 到索引 5,返回相隔的元素
按位置赋值
t[2:,3]=3
裁剪
t.clip(10,20)#把小于10的替换为10,大于20的替换为20
t3 = t2<10 #自动转换成bool 符合true 不符合false
t2[t2<10]=3 #把小于10的都赋值为3
t4= t2[t2>20]#取大于20的数
三元运算符
np.where(t>10,20,0)#把t中大于10的替换为20,其他替换为0
t3 = np.vstack((t1,t2))#竖直拼接,沿列堆叠
t4 = np.hstack((t1,t2))#水平拼接,沿行堆叠
arr = np.dstack((arr1, arr2))#沿高度堆叠,该高度与深度相同
t[[1,2],:]= t[[2,1],:] #行交换
t[:,[0,2]] = t[:,[2,0]]#列交换
arr = np.concatenate((arr1, arr2))#连接两个数组(水平)
arr = np.concatenate((arr1, arr2), axis=1)#沿着行 (axis=1) 连接两个 2-D 数组
split()#数量不足时报错
np.split(A,2,axis=1)#把A分成2块,纵向分割,等份
array_split() #数量不足时自动调整元素
newarr = np.array_split(arr, 3)#将数组分为 3 部分,不等分割
print(newarr[0])#访问拆分的数组
newarr = np.array_split(arr, 3, axis=1)#沿行拆分
newarr = np.hsplit(arr, 3)竖直拆分
newarr = np.vsplit(arr, 3)水平拆分
NumPy 提供了标准的三角函数:sin()、cos()、tan()。
舍入函数
numpy.around() 函数返回指定数字的四舍五入值。
numpy.around(a,decimals)#decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
numpy.floor() 返回小于或者等于指定表达式的最大整数,即向下取整。
np.floor(a)
numpy.ceil() 返回大于或者等于指定表达式的最小整数,即向上取整。
np.ceil(a)
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** 2)
print(a < b) print(a > b)
NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。需要注意的是数组必须具有相同的形状或符合数组广播规则。
numpy.reciprocal() 函数返回参数逐元素的倒数。如 1/4 倒数为 4/1。
np.reciprocal(a)
numpy.power() 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。
numpy.mod() 计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder() 也产生相同的结果。
矩阵相乘
矩阵相乘,就是矩阵的乘法操作,要求左矩阵的列和右矩阵的行数要一样,即MN维矩阵乘以和NY维矩阵
a = np.array([1,1],[0,1]])
b = np.arange(4).reshape((2,2))
c=a*b
点乘
矩阵点乘,就是矩阵各个对应元素相乘,要求矩阵必须维数相等,即MxN维矩阵乘以MxN维矩阵 。
c_dot = np.dot(a,b)
c_dot= a.dot(b)
广播机制broadcast
当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这种机制叫做广播(broadcasting)。
广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。
广播会在缺失和(或)长度为1的维度上进行。
这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?可以
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?不可以
x = np.where(arr == 4)#查找值为 4 的索引
x = np.where(arr%2 == 0)#查找值为偶数的索引
x = np.where(arr%2 == 1)#查找值为奇数的索引
x = np.searchsorted(arr, 7)#查找应在其中插入值 7 的索引,该方法从左侧开始搜索,并返回第一个索引,其中数字 7 不再大于下一个值。
x = np.searchsorted(arr, 7, side='right')#从右边开始查找应该插入值 7 的索引
x = np.searchsorted(arr, [2, 4, 6])#查找应在其中插入值 2、4 和 6 的索引
a = np.sort(arr)#对数组进行排序,此方法返回数组的副本,而原始数组保持不变。
arr = np.array(['banana', 'cherry', 'apple']) print(np.sort(arr))#对数组以字母顺序进行排序
arr = np.array([True, False, True]) print(np.sort(arr))#对布尔数组进行排序
arr = np.array([[3, 2, 4], [5, 0, 1]])print(np.sort(arr))#对 2-D 数组排序
不咋用,pandas大法更好用
np.loadtxt(file_path,delimiter,dtype)
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
nan
nan(NAN,Nan):not a number表示不是一个数字
什么时候numpy中会出现nan:
nan注意的点
inf
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
什么时候回出现inf包括(-inf,+inf)比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数组的视图。
a=b 完全不复制,a和b相互影响
a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
a = b.copy(),复制新数组,a和b互不影响
x = arr.view()#arr[0] = 61更改原数组,新数组也改变
x = arr.view()#x[0] = 61更改新数组,原数组也改变
检查数组是否拥有数据
print(x.base)
副本返回 None。
视图返回原始数组。
创建一个全0的数组: np.zeros((3,4))
创建一个全1的数组:np.ones((3,4))
创建一个对角线为1的正方形数组(方阵):np.eye(3)
以下默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果
最小值位置索引:np.argmin(t,axis=1)
最大值位置索引:np.argmax(t,axis=0)
求和:t.sum(axis=None)#axis控制行或列
累加:print(np.cumsum(A))
差值:print(np.diff(A))
均值:t.mean(a,axis=None) a.mean()). np.average(A)受离群点的影响较大
中值:np.median(t,axis=None)
最大值:t.max(axis=None)
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None) 即最大值和最小值之差
标准差:t.std(axis=None)
标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值
反映出数据的波动稳定情况,越大表示波动越大,约不稳定