python-数据思维

创建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()

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年5月20日
下一篇 2022年5月20日

相关推荐