用于科学计算、数学计算
ndarry,可以理解为数组里面嵌套数组
import numpy as np
import matplotlib.pyplot as plt
"""
数组与列表的区别:数组只能存储统一类型的数据元素。
优先级:字符串>浮点型>整数
"""
# 使用array()创建一个一维数组
np.array([1,2,3,4,5])
# 使用array()创建一个多维数组
np.array([[1,2,3],[4,5,6]])
# 将外部的一张图片读取加载到numpy数组中,然后尝试改变数组元素的数值查看对原始图片的影响
# 读取图片到numpy数组
img_arr = plt.imread('img_path')
# 将numpy数组的数据显示成一张图片
plt.imshow(img_arr)
# 调整颜色
plt.imshow(img_arr - 100)
# 给定形状和类型,建立3个4行5列的全是1的数组
np.ones(shape=[3,4,5])
# 在0-100间生成20个数
np.linspace(0,100,num=20)
# 设置了步长step
np.arange(0,100,step=5)
# 0-100间随机生成20个整数,从给定的由低到高的范围抽取随机整数
np.random.randint(0,100,size=(4,5))
# --------
np.random.random(size=(2,3)
# 从均值为0方差为1的正态分布中抽取样本
np.random.randn(2,3)
# numpy常用属性
# 1.描述数组每个维度的数量
img_arr.shape
# 2.显示数组尺寸
img_arr.size
# 3.描述数组类型
img_arr.dtype
# 4.计算不同类型存储最大最小的数值
np.iinfo('int8')
# numpy的数据类型
array(dtype=?) # 设定数据类型
arr.dtype='?' # 修改
# numpy的数值类型实际上是dtype对象的示例,并对应唯一的字符
arr = np.array([1,2,3,4,5])
arr.dtype
# 修改arr的数据类型为utf-8
arr.dtype = 'utf-8'
# 查看数组本身的类型是什么
tpye(arr)
[numpy常用属性和方法](https://blog.csdn.net/weixin_43874036/article/details/98599123)
# numpy的索引和切片操作(重点)
import numpy as np
import matplotlib.pyplot as plt
arr = np.random.randint(0,100,size=(6,5))
# 索引操作和列表同理
# 取出第一行列表
arr[0]
# 切出数组的前两行
arr[0:2]
# 切出数组的前两列,第一个冒号代表行,第二个冒号代表列,逗号分隔
arr[:,0:2]
# 切出前两行前两列
arr[0:2, 0:2]
# 数组行倒置
arr[::-1]
# 列倒置
arr[:, ::-1]
arr[::-1, ::-1]
# 图片行列颜色倒置
plt.imshow(img_arr[::-1,::-1,::-1])
# 图片裁剪
plt.imshow(img_arr) # 读取
plt.imshow(img_arr[60:400, 75:350]) # 裁剪
# 变形reshape:变形前后数组的容量不可以发生变化,就是该有多少数得有多少数
arr.reshape((30,))
arr.reshape((30,)).reshape((2,15)) # 2行一行15个
# 级联操作:多个numpy数组横向或纵向的拼接,concatenate
# 参数:axis,代表轴向,0代表列,1代表行
import numpy as np
arr1 = np.random.randint(0,100,size=(3,4))
arr2 = np.random.randint(0,100,size=(4,4))
np.concatenate((arr1,arr2),axis=1) # 按行为标准
np.concatenate((arr1,arr2),axis=0) # 按列为标准
# 应用:制作一个照片九宫格
arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1)
arr_9 = np.concatenate((arr_3,arr_3,arr_3),axios=0)
# 常用的聚合操作:
sum、max、min、mean
# 常用的数学函数
import numpy as np
np.sin(arr)
# 四舍五入,参数decimals,代表舍入的小数位数,默认为0,如果为负,整数舍到小数点左侧位置
arr = np.array([1.23,3.76,5.1,27,33])
np.around(arr,decimals=-1)
# 常用的统计函数
numpy.amin() # 用于计算数组中的元素沿指定轴的最大、最小值
numpy.amax()
numpy.ptp() # 计算数组中元素的最大值与最小值的差
numpy.median() # 函数用于计算数组a中元素的中位数
.std() # 标准差,体现数据平均值的分散程度,标准差是方差的平方根
.var() # 方差
# 矩阵相关:矩阵库numpy.matlib,该模块的函数返回一个矩阵,而不是ndarray对象
# 一个 的矩阵是一个由行(row)列(column)元素排列成的矩形阵列。
# 函数返回给定大小的单位矩阵。单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为 1,除此以外全都为 0
numpy.matlib.identity()
# 转置矩阵:其实就是按照读列的顺序去生成行,也就行变列,列变行
.T
# 矩阵相乘:a,b都是数组,
numpy.dot(a,b,out=None)
2 1 * 1 2 = 3 4
4 3 1 0 7 8
# 实现过程:第一个数组的行分别乘以第二个数组的列
2*1+1*1 2*2+1*0 => 3 4
4*1+3*1 4*2+3*0 7 8
numpy处理数值型数据,pandas处理非数值型数据,比如字符串、时间序列等。
pandas常用的两个类:
Series是一种对象,类似于一维数组,由values(ndarray类型)和index组成,可由列表或numpy数组创建,也可以由字典创建。
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
# 默认索引也叫隐式索引,从0开始
Series(data=[1,2,3])
# 自定义索引叫显示索引,可以通过字典来实现
dic = {
'数学':100,
'语文':20
}
Series(data=dic)
# 通过index参数设置显示索引
s = Series(data=[1,2,3],index=['a','b','c'])
# Series的索引和切片
s[0],s['a'],s.a
# 切片,切a-c
s[0:2],s['a':'c']
# Series常用属性
s.index # 索引
s.values # 值
# Series常用方法
s = Series(data=[1,1,1,2,2,3,4,5,6,6,6,6,7,8])
# 1.取前三个元素
s.head(3)
# 2.取后三个元素
s.tail(3)
# 3.将Series元素进行去重
s.unique()
# 4.统计去重之后的元素个数
s.nunique()
# 5.统计Series中每个元素出现的次数
s.value_counts()
# Series的算数运算:索引一致的元素进行算数运算否则用NaN补空
s1 = Series(data=[1,2,3],index=['a','b','c'])
s2 = Series(data=[4,5,6],index=['a','d','c'])
s1+s2
# 索引b和d不一致,所以这两项返回NaN
# 判读是否为空,返回布尔值
s.isnull()
s.notnull()
# 将s中的空值进行清洗过滤,可以通过将布尔值作为Series的索引,可以通过.notnull()
s[[True,False,True,False]]
# s1.add(s2)和s1+s2是一样的
是一种表格型数据结构,由一定顺序排列的多列数据组成。
设计初衷是将Series的使用场景从一维=>多维,所以有行索引index和列索引columns,值values。
可由ndarray创建,也可以由字典创建。
# DataFrame的创建
# ndarray对象创建
DataFrame(data=np.random.randint(0,100,size=(5,6)))
# 字典方式创建,行索引index,列索引dic的键
dic = {
'name':['jay','tom','bobo'],
'salary':[1000,2000,3000]
}
df = DataFrame(data=dic,index=['a','c','c'])
# DataFrame的属性
df.shape
df.values
df.index
df.columns
# DataFrame索引操作
# 取列
df['张三']
# 取行,通过显示索引取
df.loc['英语']
# 取第一行,通过隐式索引取
df.iloc[0]
# 通过索引取元素
df.loc['英语','张三']
df.loc['英语',['张三','李四']]
# 中括号中直接作用的切片是行切片
df[0:2]
# 列切片
df.iloc[:,0:2]
# DataFrame的运算
"""
假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。
假设张三期中考试数学被发现作弊,要记为0分,如何实现?
李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?
"""
dic = {
'张三':[150,150,150,150],
'李四':[0,0,0,0]
}
df = DataFrame(data=dic,index=['语文','数学','英语','理综'])
# 1.
qizhong = df.copy()
qimo = df.copy()
(qizhong+qimo) / 2
# 2.数学是第二行,张三是第一位,一步步切片
qizhong.iloc[1,0] = 0
# 3.单独的找到李四这个人,直接加索引
qizhong['李四'] += 100
# 4.需要在所有值上进行操作,就是直接加就行了,都不用什么索引切片
qizhong += 10