是使用Python进行科学计算的基础软件包,包含强大的N维数组对象和向量运算。
使用array函数从列表list或元组tuple中创建数组。
能够创建具有初始占位符的函数(zeros、ones、empty)
(1)numpy.zeros(shape, dtype=float, order=‘C’)
形状:整数或整数元组,定义数组的尺寸。
dtype(可选):数据类型,默认为numpy.float64。
顺序(可选):{‘C’, ‘F’},定义在内存中存储数据的顺序,,即行主要(C样式)或列主要(Fortran样式)
(2)numpy.ones:可以创建指定长度或者形状的全1数组
(3)empty():创建一个数组,其初始内容是随机的,取决于内存的状态
(4)arange():创建一个数组,内容是数字,可定义步长
(5)reshape():重新定义数组的形状
(6)数组的属性(维度、形状、元素个数、元素类型)
不用编写循环即可对数据执行批量运算。这通常叫做矢量化(vectorization)。
大小相等的数组之间的任何算术运算都会将运算应用到元素级。同样,数组与标量的算术运算也会将那个标量值传播到各个元素。
1、基本运算(加减乘除幂):行数列数相同,其中数据直接计算
2、矩阵乘法dot(第一个列数等于第二个行数)
3、单个矩阵其它运算有:求和、最大最小值及其下标、均值、转置、多维变一维
sum max min argmin argmax mean tranpose() flatten()
取数组的行(列)、某行某列的元素、一行的部分列
是建立在numpy基础上的高效数据分析处理库,常与numpy和matplotlib一同使用。
核心数据结构有两个。
Series是一种类似于一维数组的对象,它由一维数组(各种numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
1、使用列表和字典实例化
2、可指定索引、获取值和索引
3、可通过索引(列表)获取单个或一组值
4、可进行加减乘除幂的运算
import numpy as np
a=['a','b','c','d','e']
b=[100,200,100,400,500]
s=pd.Series(a,index=b)
print(s)
print(type(s))
dic={'a':1,'b':2}
print(pd.Series(dic))
print(s.values)
print(s.index)
print(s[100,400])
-------------------------------------
import pandas as pd
s = pd.Series(np.array([1,2,3,4,5]), index=['a', 'b', 'c', 'd', 'e'])
print(s+s)
print(s*s)
print(s**3)
1、实例化
100 a
200 b
100 c
400 d
500 e
dtype: object
a 1
b 2
dtype: int64
2、获取值和索引
['a' 'b' 'c' 'd' 'e']
Int64Index([100, 200, 100, 400, 500], dtype='int64')
3、通过索引获取值
100 a
100 c
dtype: object
400 d
100 a
100 c
dtype: object
4、加减乘除运算
a 2
b 4
c 6
d 8
e 10
dtype: int32
a 1
b 4
c 9
d 16
e 25
dtype: int32
a 1
b 8
c 27
d 64
e 125
dtype: int32
5、数据对齐
在算术运算中自动对齐不同索引的数据,Series 和多维数组的主要区别在于, Series 之间的操作会自动基于标签对齐数据。因此,不用顾及执行计算操作的 Series 是否有相同的标签。
obj1 = pd.Series({"Ohio": 35000, "Oregon": 16000, "Utah": 5000})
print(obj1)
obj2 = pd.Series({"California": np.nan, "Ohio": 35000, "Oregon": 16000, })
print(obj2)
print(obj1 + obj2)
Ohio 35000
Oregon 16000
Utah 5000
dtype: int64
California NaN
Ohio 35000.0
Oregon 16000.0
dtype: float64
California NaN
Ohio 70000.0
Oregon 32000.0
Utah NaN
dtype: float64
6、索引和切片
s = pd.Series(np.array([1,2,3,4,5]), index=['a', 'b', 'c', 'd', 'e'])
print(s[1:])
print(s[1:] + s[:-1])
b 2
c 3
d 4
e 5
dtype: int32
a NaN
b 4.0
c 6.0
d 8.0
e NaN
dtype: float64
DataFrame是一个表格型的数据结构,类似于Excel或sql表,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等),DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
1、使用多维数组字典、列表字典、Series字典生成
data = {'state': ['Ohio', 'Nevada', 'Nevada'], 'year': [2000,2001, 2002], 'pop': [1.5, 2.4, 2.9]}
frame = pd.DataFrame(data)
print(frame)
print(type(frame))
d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
print(pd.DataFrame(d))
执行结果:
state year pop
0 Ohio 2000 1.5
1 Nevada 2001 2.4
2 Nevada 2002 2.9
<class 'pandas.core.frame.DataFrame'>
one two
a 1.0 1.0
b 2.0 2.0
c 3.0 3.0
d NaN 4.0
2、可指定列索引顺序
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three'])
print(frame2)
执行结果:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Nevada 2.4 NaN
three 2002 Nevada 2.9 NaN
3、可以列名为索引获取值
print(d['one'])
a 1.0
b 2.0
c 3.0
dtype: float64
4、一列值的修改
frame2['debt'] = 16.5
print(frame2)
frame2['new'] = frame2['debt' ]* frame2['pop']
print(frame2)
执行结果:
year state pop debt new
one 2000 Ohio 1.5 16.5 24.75
two 2001 Nevada 2.4 16.5 39.60
three 2002 Nevada 2.9 16.5 47.85
year state pop debt new
one 2000 Ohio 1.5 16.5 24.75
two 2001 Nevada 2.4 16.5 39.60
three 2002 Nevada 2.9 16.5 47.85
是一个主要用于绘制二维图形的Python库,由各种可视化类构成,内部结构复杂。matplotlib.pylot是绘制各类可视化图形的命令字库。
1、绘制折线图(y是关于x的函数)
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,50) #等差数列
y1 = 2*x + 1
y2 = x**2
plt.figure()#生成画布
plt.plot(x,y1)
plt.figure(figsize=(7,5))
plt.plot(x,y2)
plt.show()
2、绘制不同的y1、y2
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(7,5))
plt.plot(x,y1,color='red',linewidth=1)
plt.plot(x,y2,color='blue',linewidth=5)
plt.xlabel('x',fontsize=20)
plt.ylabel('y',fontsize=20)
plt.show()
l1, = plt.plot(x,y1,color='red',linewidth=1)
l2, = plt.plot(x,y2,color='blue',linewidth=5)
plt.legend(handles=[l1,l2],labels=['aa','bb'],loc='best')#图例
plt.xlabel('x')
plt.ylabel('y')
plt.xlim((0,1)) #x轴只截取一段进行显示
plt.ylim((0,1)) #y轴只截取一段进行显示
plt.show()
3、散点图
dots1 =np.random.rand(50)
dots2 =np.random.rand(50)
plt.scatter(dots1,dots2,c='red',alpha=0.5) #c表示颜色,alpha表示透明度
plt.show()
4、柱状图
x = np.arange(10)
y = 2**x+10
plt.bar(x,y,facecolor='#9999ff',edgecolor='white')#柱状图的柱有里面的颜色和外面的框框
plt.show()
x = np.arange(10)
y = 2**x+10
plt.bar(x,y,facecolor='#9999ff',edgecolor='white')
for ax,ay in zip(x,y):
plt.text(ax,ay,'%.1f' % ay,ha='center',va='bottom')#显示值
plt.show()
PIL库是一个具有强大图像处理能力的第三方库。图像的组成:由RGB三原色组成,RGB图像中,一种彩色由R、G、B三原色按照比例混合而成。0-255区分不同亮度的颜色。图像的数组表示:图像是一个由像素组成的矩阵,每个元素是一个RGB值。
1、读取图像并获取图像相关参数
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('F:/图片/壁纸/2000953.jpg')
plt.imshow(img)
plt.show(img)
print(img.mode)
a,b=img.size
print(img.size)
可以使用 img.show()显示图片,但是它调用的是计算机上显示图片的工具,等同于在计算机打开图片。
2、图片旋转rotate()、剪切crop()、缩放resize()、transpose左右旋转transpose(Img.FLIP_LEFT_RIGHT)、上下旋转(Img.FLIP_TOP_BOTTOM)
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('F:/图片/壁纸/2000953.jpg')
img1=img.rotate(50)
plt.imshow(img1)
plt.show(img1)
img_crop_result = img.crop((100,200,500,800))
#crop()四个参数分别是:(左上角点的x坐标,左上角点的y坐标,右下角点的x坐标,右下角点的y坐标)
plt.imshow(img_crop_result)
plt.show(img_crop_result)
#缩放,长和宽到原来的0.6倍,Image.ANTIALIAS:尽量高质量地缩放
img_resize_result = img.resize((int(a*0.4),int(b*0.4)),Image.ANTIALIAS)
plt.imshow(img_resize_result)
plt.show(img_resize_result)
#左右镜像
img_lr = img.transpose(Image.FLIP_LEFT_RIGHT)
#左右旋转
#展示左右镜像图片
plt.imshow(img_lr)
plt.show(img_lr)
#上下镜像
img_bt = img.transpose(Image.FLIP_TOP_BOTTOM)
#上下旋转
#展示上下镜像图片
plt.imshow(img_bt)
plt.show(img_bt)
数据增强
深度神经网络一般需要大量的训练数据才能获得比较理想的结果。
数据量有限时,可以通过数据增强来增加训练样本的多样性。
例如:反转、噪声(random)、旋转、裁剪、缩放、模糊等
随机亮度调整
训练过程可视化
数据可视化分析
1、获取数据
import matplotlib.pyplot as plt
import numpy as np
import json
import matplotlib.font_manager as font_manager
%matplotlib inline
with open('20200422.json', 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())
zones = []
for star in json_array:
zone = star['zone']
zones.append(zone)
print(len(zones))
print(zones)
zone_list = []
count_list = []
for zone in zones:
if zone not in zone_list:
count = zones.count(zone)
zone_list.append(zone)
count_list.append(count)
print(zone_list)
print(count_list)
或者
df = pd.read_json('20200422.json')
grouped=df['name'].groupby(df['zone'])
s = grouped.count()
zone_list = s.index
count_list = s.values
2、画图
# 设置显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.figure(figsize=(20,15))
plt.bar(range(len(count_list)), count_list,color='r',tick_label=zone_list,facecolor='#9999ff',edgecolor='white')
# 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小
plt.xticks(rotation=45,fontsize=20)
plt.yticks(fontsize=20)
plt.legend()
plt.title('''《青春有你2》参赛选手''',fontsize = 24)
plt.show()
1、获取数据
import matplotlib.pyplot as plt
import numpy as np
import json
import matplotlib.font_manager as font_manager
%matplotlib inline
df = pd.read_json('20200422.json')
grouped=df['name'].groupby(df['weight'])
s = grouped.count()
weight_list = s.index
count_list = s.values
print(weight_list)
print(count_list)
执行结果:
Index(['40kg', '41kg', '42kg', '43kg', '44kg', '45kg', '46kg', '47kg',
'48.5kg', '48kg', '49kg', '50kg', '51.5kg', '51kg', '52.5kg', '52kg',
'53kg', '54kg', '55kg', '56kg', '58kg', '59kg'],
dtype='object', name='weight')
[ 2 1 4 4 9 5 12 11 1 19 11 12 1 3 1 4 1 2 1 2 2 1]
2、数据分析
weight=['<=45kg','45~50kg','50~55kg','>55kg']
counts=[0,0,0,0]
for w in range(len(weight_list)):
if weight_list[w]<='45kg':
counts[0]=counts[0]+count_list[w]
elif weight_list[w]>'45kg' and weight_list[w]<='50kg':
counts[1]=counts[1]+count_list[w]
elif weight_list[w]>'50kg' and weight_list[w]<='55kg':
counts[2]=counts[2]+count_list[w]
else:
counts[3]=counts[3]+count_list[w]
print(counts)
执行结果:
[25, 66, 13, 5]
3、饼状图绘制
plt.rcParams['font.sans-serif']=['SimHei']
ex=[0,0,0.1,0]
plt.pie(counts,labels=weight,autopct="(%1.1f%%)",explode=ex)
#explode:每个饼块相对于饼圆半径的偏移距离,取值为小数。形式为类1维数组结构,值越大偏移距离越远。
plt.title('''《青春有你2》参赛选手体重饼状图''',fontsize = 24)
plt.show()
题外话:这两天感觉Typora这个记笔记的软件不错,直接在那里记笔记了,图片什么的复制不过来,不搞了就