创建ndarray数组
- array函数接受一切序列型的对象( 例如列表),并产生一个新的含有传入数据的numPy数组。
import numpy as np
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
print(arr1)
[6. 7.5 8. 0. 1. ]
- 可创建多维数组
- shape指出数组的形状,shape是个元组
- ndim指出数组的维度
- dtype指出数组中的元素的类型
import numpy as np
data1 = [[6, 7.5, 8, 0, 1], [3.2, 3, 7, 52, 23.4]]
arr1 = np.array(data1)
print(arr1.shape, arr1.ndim, arr1.dtype)
(2, 5) 2 float64
- reshape函数可以改变数组的维度
- astype 函数可生成一个新的数组,并指定新的dtype
import numpy as np
arr1=np.array([1,2,3,4,5,6])
arr1=arr1.reshape(2,3)
print(arr1)
[[1 2 3]
[4 5 6]]
- zeros 和 ones 函数 可以 创建 指定 长度 或 形状 的 全 0 或 全 1 数组
from numpy import array
array([0.,0.,0.,0.,0.])
array([0., 0., 0., 0., 0.])
np.ones(6)
array([1., 1., 1., 1., 1., 1.])
创建初始值为0,终值为1,步长为0.1的等差数组
np.arange(0,1,0.1)
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
创建初始值为0,终值为1,元素个数为10的等差数组
np.linspace(0,1,10)
array([0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
创建从100到102,共5个元素的等比数列
np.logspace(0,2,5)
array([ 1. , 3.16227766, 10. , 31.6227766 ,
100. ])
numpy.random.rand(d0, d1, …, dn):生成一个[0,1)之间的随机浮点数或N维浮点数组。
生成2行3列的随机数数组,值在[0,1)之间
np.random.rand(2, 3)
array([[0.95037869, 0.973173 , 0.98286249],
[0.69060825, 0.96183338, 0.75928584]])
numpy.random.randn(d0, d1, …, dn):生成一个浮点数或N维浮点数组,取数范围:正态分布的随机样本数。
生成2行3列的随机数数组,值为正态分布的随机样本数
np.random.randn(2, 3)
array([[ 0.66686711, -0.27895588, -2.02200514],
[ 1.09895485, -2.01676474, -0.48062357]])
numpy.random.randint(low, high=None, size=None, dtype=‘l’):生成一个整数或N维整数数组,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
生成包含10个元素的值在[0,100) 的数组
np.random.randint(0, 100, 10)
array([55, 28, 53, 59, 27, 71, 17, 5, 21, 92])
生成2*3维的值在[0,100) 的数组
np.random.randint(0, 100, (2,3))
array([[65, 37, 72],
[26, 70, 38]])
- normal():正态分布,前两个参数分别为期望值和标准差。
- uniform():均匀分布,前两个参数分别为区间的起始值和终值。
- poisson():泊松分布,第一个参数指定λ系数,它表示单位时间(或单位面积)内随机事件的平均发生率。输一个整数数组。
r1 = np.random.normal(100, 10, (4, 3))
r2 = np.random.uniform(10, 20, (4, 3))
r3 = np.random.poisson(2.0, (4, 3))
print(r1)
print(r2)
print(r3)
[[119.49006926 99.6777342 96.15609946]
[103.14035375 102.52023622 110.05252578]
[ 98.78937596 92.52315827 120.20142524]
[ 88.41005568 115.13081429 100.10488106]]
[[15.33053313 12.79943738 19.29833314]
[18.48326387 13.64978122 14.29641824]
[11.3836399 10.13409011 11.9494954 ]
[11.30621185 10.75063446 13.64733945]]
[[2 2 1]
[0 2 1]
[1 2 1]
[4 3 6]]
从文本文件构造数组
将数组写入文本文件
np.savetxt('1.txt', arr1, fmt='%0.4f', delimiter=',')
访问 数组元素
用下标访问元素
x = np.array([1, 2, 3, 4, 5, 6])
print(x[4])
5
x=np.array([[1,2,3],[4,5,6]])
print(x[1])
[4 5 6]
arr=np.arange(10)
print(arr)
print(arr[5:8])
arr[5:8]=12
print(arr)
[0 1 2 3 4 5 6 7 8 9]
[5 6 7]
[ 0 1 2 3 4 12 12 12 8 9]
- 数组切片是原始数组的视图
- 视图上的任何修改都会直接反应到源数组
arr = np.arange(10)
arr_slice = arr[5:8] #获得一个视图而不是新的数组
arr_slice[1] = 32
print(arr)
[ 0 1 2 3 4 5 32 7 8 9]
想通过切片获得新数组的方法
arr_slice = arr[5:8].copy()
arr_slice
下面的代码访问数组x中第1行第2列的元素(从0开始计数)
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d[1, 2]) #等价于print(arr2d[1][2])
print(arr2d[1]) #数组子集(也是视图)
6
[4 5 6]
arr2d = np.array([[1, 2, 3], [4, 5, 6],[7,8,9]])
print(arr2d[:2]) #在轴0上切片
print(arr2d[:2, 1:]) #在轴0和轴1上切片
[[1 2 3]
[4 5 6]]
[[2 3]
[5 6]]
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d[1, :2]) #轴0选第一行,然后在轴1上切片
print(arr2d[:, 1]) #轴0全选,然后选取第1列
[4 5]
[2 5]
import numpy as np
arr2d = np.linspace(1, 100,12).reshape(4,3)
print(arr2d[[2,0,1]]) #依次选取轴0的2,0,1行
print(arr2d[:,[2,0]]) #依次选取轴1的2,0列
[[55. 64. 73.]
[ 1. 10. 19.]
[28. 37. 46.]]
[[ 19. 1.]
[ 46. 28.]
[ 73. 55.]
[100. 82.]]
arr2d = np.array([[1, -2, 3], [-4, 5, 6]])
print(arr2d<0) #arr2d<0 是个布尔型数组
print(arr2d[arr2d<0]) #用布尔型数组来索引
arr2d[arr2d<0]=0 # 赋值
print(arr2d)
[[False True False]
[ True False False]]
[-2 -4]
[[1 0 3]
[0 5 6]]
各种索引方式可以结合:
- 单元素
- 切片
- 列表索引
- 布尔型索引
numpy的基本运算
numpy中提供了很多用于标量、向量和矩阵运算的函数
-
标量可看成11的矩阵,向量可看成1n或n*1的矩阵。
-
二维数组即nm的矩阵。nn的矩阵即为方阵。
-
主要的基本运算有算术运算,关系运算,逻辑运算。
形状相同的数组之间、数组与标量之间都可以进行算数运算,这些运算会传播到数组中的每一个元素,这种传播到元素的运算方式被称为广播运算。
data1 = [[6, 7.5, 8, 0, 1], [3.2, 3, 7, 52, 23.4]]
arr1 = np. array( data1)
arr1 = arr1* 2 #这是广播运算
print(arr1)
[[ 12. 15. 16. 0. 2. ]
[ 6.4 6. 14. 104. 46.8]]
下面这些函数本质上是针对于标量操作的,如果将其应用到向量或矩阵,则是对向量或矩阵的每个元素进行相应的操作。
- 三角函数
- sin, sinh, arcsin, cos, cosh, arccos, tan, tanh, arctan
- 取整
- ceil, fix, round, floor
- 其它:
- mod, sqrt, abs, sign
对m*n矩阵, 如果参数axis为0(第0轴),以矩阵的每列为单位进行运算,结果是向量;参数axis为1(第1轴)时,指定以每行为单位进行运算,结果也是向量; 如果不指定axis参数,则对矩阵的所有参数进行计算,结果是个标量。
- max 求最大值
- mean 求平均值
- prod 求乘积
- any 判断向量是否全0
- min 求最小值
- sum 求和
- sort 排序
- all 判断向量是否全1
矩阵运算函数
pandas数据分析库
-
numpy能够处理的文件格式有限,只能读取txt文件和csv文件。
在机器学习和数据分析领域,经常使用pandas从excel载入数据 -
pandas是python的数据分析软件包,专门用来处理电子表格数据。
-
最常用的pandas 对象 是 DataFrame,它是 一个 面向 列( column- oriented) 的 二维 表 结构, 且 含 有行 标 和 列 标
-
from pandas import DataFrame
-
import pandas as pd
-
使用read_excel函数从excel文件载入数据
-
read_excel函数返回DataFrame对象
-
用to_excel函数写入excel文件
-
如果没有index=False,DataFrame的index将被写入文件
-
在机器学习中,经常需要挑选excel文件中的某些列或某些行,作为机器学习算法的输入,此时,可使用索引功能。
Dataframe的索引方式有三种: []与.列名, .loc, .iloc,
[]与.列名切片方式对列进行索引。
.loc索引方式基于行名和列名进行索引,若没有行名或列名就基于编号。
.iloc索引方式基于行编号和列编号进行索引。
data[‘开盘’] #单索引, 等价于 data.开盘
data[[‘开盘’,‘最低’]] #列表索引
data[ data.开盘>2800 ] #布尔索引
- .loc索引方式基于行名和列名两个维度进行索引,若没有行名或列名就基于编号
- 可用的索引方法和numpy数组相同:单索引、切片、列表索引、布尔型索引
data.loc[ [2, 3, 8], ‘开盘’] 行为列表索引,列为单索引
data.loc[3:8, [‘开盘’,‘最低’]] 行为切片,列为列表索引
data.loc[:, ‘开盘’:‘最低’] 行为全切片,列为切片
data.loc[data.开盘>2800, ‘开盘’:‘最低’ ] 行为布尔索引,列为切片
-
如果只提供一个维度的索引,则进行行索引
-
.iloc索引方式基于行编号和列编号两个维度进行索引,
可用的索引方法和.loc相同
data.iloc[ [2, 3, 8], 1] 行为列表索引,列为单索引
data.iloc[3:8, [1, 3]] 行为切片,列为列表索引
data.iloc[:, 1:4] 行为全切片,列为切片
data.iloc[list(data.开盘>2800), 1:4]行为布尔索引,列为切片
- 注意,这里必须用list转换一下,去掉布尔索引后带的行号
如果只提供一个维度的索引,则进行行索引
matplotlib绘图
- plt.plot(x,y,fmt,…)
- 注意,如果要在不同窗口分别绘制不同图形,可以用figure使用不同的编号。
import numpy as np
import matplotlib.pyplot as plt
x=[1 ,2 ,3, 4 ,5, 6 ,7]
y=[1,4,9,16,25,36,49]
fig1=plt.figure('fig1')
plt.plot(x,y)
plt.savefig('image0.jpg', dpi=800)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kObVzc1A-1652859314134)(output_64_0.png)]
-
默认使用英文字库,汉字会乱码,要指定中文字库
-
一个figure对象代表一个画布
-
第一个参数是序号,可为数字或字符串,用来区分不同画布;可用figsize参数指明画布大小。
fig1=plt.figure(‘fig1’, figsize=(7,5))
-
默认使用一个画布
-
如果要拥有多个画布,可用figure函数创建。
plt.plot(x,y,‘b:s’,label=‘直线’)
- ‘b:s’包含线的颜色
- 线条的颜色:r红色、g绿色、b蓝色、m洋红、k黑色等
- 线的类型:实线-、虚线–、虚点线-.、点线: 等
- 标记符号:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='simHei'
x=[1 ,2 ,3, 4 ,5, 6 ,7]
y=[1,4,9,16,25,36,49]
fig1=plt.figure('fig1')
plt.plot(x,y,'r-',label='抛物线')
plt.plot(x,x,'b:s',label='直线')
plt.title('抛物线 直线')
plt.xlabel('自变量')
plt.ylabel('因变量')
plt.legend(loc='lower right')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kplK3t2F-1652859314136)(output_66_0.png)]
-
Label表示要显示标注的内容
-
title表示图表标题
-
plt.xlabel(‘自变量’),表示横坐标方向的提示
-
plt.ylabel(‘因变量’),表示纵坐标方向的提示
-
plt.legend(loc=‘lower right’),表示标注的显示位置
分别有:lower right、lower left、upper left、upper right、upper center、lower center
plt.pie(data,explode)
- Data为绘图数据,explode为图形显示的方式,为0表示该部分与整个图不分离,大于0表示该部分与整个图分离,分离距离与该数据大小有关。
import numpy as np
import matplotlib.pyplot as plt
labels='优秀','良好','中等','及格','不及格'
x=[8 ,20 ,35, 27 ,10]
y=[0,0.2,0,0,0.1] # explode,分离的距离
fig1=plt.figure('fig1')
plt.pie(x,y,labels,autopct='%1.2f%%')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N1Oj8Fbz-1652859314137)(output_69_0.png)]
plt.bar(left,height,width,bottom)
- Left为x轴坐标,height为条形高度,width为宽度(默认0.8),bottom为条形起始位置(ex4.py)
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['font.family']='simHei'
N=5
y=[20,10,30,25,15]
x=np.arange(N)
plt.bar(x,y,width=0.5,bottom=0)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jnvhxPKk-1652859314137)(output_71_0.png)]
import numpy as np
import matplotlib.pyplot as plt
# 数据
x = np.arange(4)
Bj = [52, 55, 63, 53]
Sh = [44, 66, 55, 41]
bar_width = 0.3
# 绘图 x 表示 从那里开始
plt.bar(x, Bj, bar_width)
plt.bar(x+bar_width, Sh, bar_width, align="center")
# 展示图片
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tV0KyHKi-1652859314138)(output_72_0.png)]
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 将全局的字体设置为黑体
matplotlib.rcParams['font.family'] = 'SimHei'
N = 5
y = [20, 10, 30, 25, 15]
x = np.arange(N)
str1 = ("北京", "上海", "武汉", "深圳", "重庆")
# 绘图 x x轴, height 高度, 默认:color="blue", width=0.8
p1 = plt.bar(x, height=y, width=0.5, label="城市指标", tick_label=str1)
# 添加数据标签
for a, b in zip(x, y):
plt.text(a, b, '%.0f' % b, ha='center', va='bottom', fontsize=10)
# 添加图例
plt.legend()
# 展示图形
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yGQLXz9h-1652859314138)(output_73_0.png)]
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(0, 2*np.pi, 20)
y=1+x*x
plt.polar(x,y,'r--') #角度,半径,红色虚线
plt.title('polar')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n2thHPec-1652859314139)(output_74_0.png)]
import matplotlib.pyplot as plt
import numpy as np
x=[0.1 ,0.2, 0.4, 0.5, 0.7, 0.8, 0.89, 0.91, 0.92, 0.93, 0.94]
y=[0.6, 0.65 ,0.7, 0.8, 0.86, 0.9, 0.93, 0.96, 0.98, 0.99,1.0]
plt.scatter(x,y)
plt.title('scatter')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XfSJcL5W-1652859314139)(output_75_0.png)]
plt.hist(x,bins,normed)
X为统计的数据
Bins为分段数
Normed每个条状图占比比例,默认为1,可以自己设置。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(0)
mu,sigma=100,20
a=np.random.normal(mu,sigma,size=100)
plt.hist(a,10,density=True,histtype='stepfilled',facecolor='b',
alpha=1)#原始数据,分块数,类型,颜色,颜色显示比例
plt.title('Histogram')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhEhwmOA-1652859314140)(output_77_0.png)]
绘制子图
在matplotlib下,一个Figure对象可以包含多个子图(Axes),可以使用subplot()添加子图,返回axes对象:
axes = plt.subplot(numRows, numCols, plotNum)
图表的整个绘图区域被分成numRows行和numCols列,plotNum参数指定创建的Axes对象所在的区域
例如:plt.subplot(221) //分成2×2,占用第一个,即第一行第一列的子图 ;221等价于2,2,1
也可以用figure对象的add_subplot函数来添加子图,参数同上。
import numpy as np
import matplotlib.pyplot as plt
t=np.arange(0.0,2.0,0.1)
s=np.sin(t*np.pi)
ax1=plt.subplot(221)
ax1.plot(t,s,color="r",linestyle="--")
ax2=plt.subplot(222)
ax2.plot(t,s,color="y",linestyle="-")
ax3=plt.subplot(223)
ax3.plot(t,s,color="g",linestyle="-.")
ax4=plt.subplot(224)
ax4.plot(t,s,color="b",linestyle=":")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9TnmeeX-1652859314141)(output_80_0.png)]
Subplot(212)表示将子图下面的合并
Subplot(211)表示将子图上面那部分合并
import numpy as np
import matplotlib.pyplot as plt
t=np.arange(0.0,2.0,0.1)
s=np.sin(t*np.pi)
ax1=plt.subplot(221)
ax1.plot(t,s,color="r",linestyle="--")
ax2=plt.subplot(222)
ax2.plot(t,s,color="y",linestyle="-")
ax3=plt.subplot(212)
ax3.plot(t,s,color="g",linestyle="-.")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m68o0kBS-1652859314141)(output_82_0.png)]
用PIL的Image处理图像
打开图片
使用Image类的open方法打开图片,如果打开成功,返回一个Image对象:
im = Image.open(“lena.jpg”)
新建图片
Image.new(mode, size, color=0)
mode: ‘1’ 黑白图 ‘L’ 8位灰度 ‘RGB’ 24位彩色 ‘RGBA’ 32位彩色
im = Image.new( ‘RGBA’, (256,256) )
显示图片
借助matplotlib显示图片
import matplotlib.pyplot as plt
plt.imshow(im)
plt.show()
保存图片
Image模块中的save()函数可以保存图片,除非你指定文件格式,否则扩展名用来指定文件格式。将前面打开的图片存为png格式:
im.save(“lena.png”)
获取图片尺寸
width, height = im.size
Size是Image类的属性,类型是元组,上面省略了()
(width, height) = im.size
获取图片通道信息
bands=im.getbands() #返回元组
例如,如果图片是带alpha通道的彩色图片,则返回:
(‘R’,‘G’,‘B’,‘A’)
区域由4-tuple决定,该tuple中信息为(left, upper, right, lower)。
Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点
box = (50, 50, 200, 200)
region = im.crop(box)
plt.imshow(region)
plt.show()
使用paste函数将一个图片粘贴到另一个图片上面
Image.paste(im, box=None, mask=None)
前面裁剪下的子图旋转180度后,再粘贴回原来的图:
box = (50, 50, 200, 200) region = im.crop(box) region = region.transpose(Image.ROTATE_180) im.paste(region, box) plt.imshow(im) plt.show()
将子图paste回原图时,子图的大小要和box匹配
改变图像尺寸
Image.resize(size, resample=0, box=None) im=im.resize((80,80))
逆时针旋转图片
Image.rotate(angle, resample=0, expand=0, center=None, translate=None) im=im.rotate(20)
图片变换
Image.transpose(method) 置换(左右,上下) FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, 翻转 ROTATE_90, ROTATE_180, ROTATE_270,逆时针旋转 im = im.transpose(Image.ROTATE_90)
改变图像模式
Image.convert(mode=None,matrix=None, dither=None,palette=0,color=256) mode: '1' 2位图 'L' 8位灰度 'RGB' 24位彩色 'RGBA' 32位彩色 im=im.convert('L')
用PIL的ImageDraw绘图
要将图片当做画板作画,可以使用ImageDraw
from PIL import Image,ImageDraw
im=Image.new('RGB',(1024,800)) #新建图片
#im = Image.open('lena.jpg') #打开已有图片
draw = ImageDraw.Draw(im)
ImageDraw.line(xy, fill=None, width=0)
draw.line([100,100,100,600],fill='blue', width=10)
draw.line([(100,100),600,100],fill='red', width=10)
draw.line([(600,100),(600,600)],fill="green", width=10)
draw.line((100,600,600,600),fill="yellow", width=10)
im.show()
ImageDraw.rectangle([x1,y1,x2,y2],options)
draw.rectangle((200,200,500,500),outline="red")
draw.rectangle((250,300,450,400),fill=128)
ImageDraw.ellipse(xy,fill=None,outline=None)
draw.ellipse((100,100,600,600),outline=128)
draw.ellipse((100,250,600,450),fill="blue")
ImageDraw.arc(xy, start, end, fill=None)
#画一个60度蓝色圆弧
draw.arc((100,100,600,600),0,90,fill="blue")
#画一个上半圆弧
draw.arc((100,100,600,600),180,360,fill="red")
#画一个右半椭圆,只需改区域大小为长方形
draw.arc((100,100,600,400),90,270,fill="blue")
drawObject.polygon(([x1,y1,x2,y2,…],options)
draw.polygon([(200,200),(600,300),(300,600)],outline="red")
draw.polygon([(300,300),(500,300),(300,500),(500,500)],fill="red")
ImageDraw.text(position, string, options)
#在空白图像上矩形区域内添加文字
text="Ilovepython!"
draw.rectangle((200,200,500,500),outline="red")
draw.text([300,350],text,"red")
设置字体
from PIL import ImageFont
font = ImageFont.truetype("arial.ttf", 20)
draw.text([300,350],text,"red", font)
im.show()
文章出处登录后可见!