Numpy学习
1 .数据的维度
1.1 一维数据
一维数据由对等关系的有序或无序数据构成,采用线性方式组织。对应列表(有序)、数组和集合(无序)等类型。
例子:列表和数组
- 相同点 : 都是一组数据的有序结构
- 区别:
1.2 二维数据
二维数据由多个一维数据构成,是一维数据的组合形式。表格是典型的二维数据,对应列表类型来表示。
2.Numpy的数据对象ndarry
2.1 为什么要引入一个数组对象,列表不行吗?
- 数组对象可以去掉元素间运算所需的循环,使得一维向量更像单个数据
- 设置专门的数组对象,经过优化,可以提升这类应用的运算速度
- 数组对象采用相同的数据类型,有助于节省运算和存储空间
在numpy中,我们不再以单个数据为基本单位运算,而是以数组为基本单位运算。在右图中我们可以发现numpy中不再使用for循环。
2.1 ndarry对象的构成
ndarry是一个多维数组对象,由两部分构成
- 实际的数据
- 描述这些数据的元数据(数据维度、数据类型等)
案例:ipython新建一个数组类型
数据的描述项:包括最大值,最小值,维度,元素类型,元素对象的个数等
可视化
2.3 ndarray对象的属性
案例:ipython中输出数组对象的属性
2.4 ndarray数组的创建
(1) 从Python中的列表、元组等类型创建ndarray数组
x = np.array(list/tuple)
x = np.array(list/tuple,dtype = np.float32)
当np.array()不指定dtype时,Numpy将根据数据情况关联一个dtype类型
(2)使用Numpy中函数创建ndarray数组,如arange,ones,zeros等
np.linspace(begin,end,size,endpoint)
:参数begin代表开始元素,end代表结束元素,size代表数组元素个数,endpoint为False表示end不作为数组的最后一个元素出现,数组要再多分一份出来
2.5 ndarray数组的变换
(1) numpy数组的维度变换
注意reshape和resize的区别:
- 两个都可以变换维度,但是保证变换前后数组元素个数相同
- reshape进行维度变换后,并不改变原数组
- resize进行维度变换后,原数组也进行修改
使用flatten()对数组进行降维,且原数组不变
(2) ndarray数组的类型变换
方法:new_a = a.astype(new_type)
注意:astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致
通过id可以发现使用astype方法,即使类型一致,也会在内存区域新开辟一块空间(id不同)
(3) ndarray数组向列表的转换
方法:Is = a.tolist()
2.6 numpy数组的操作
(1) 数组的索引与切片
- 一维数组的索引与切片
- 多维数组的索引
注意负数的索引代表从右往左数,-1代表第一个元素,-2代表第二个元素
- 多维数组的切片
2.7 numpy数组的运算
- 数组与标量之间的运算作用于数组的每一个元素
Numpy一元函数:对ndarray中的数据执行元素级运算的函数
注意:ceil是向上取整,而floor是向下取整
Numpy二元函数
3.数据的CSV文件读取
3.1 CSV文件存储
案例:
3.2 CSV文件读入
3.3 CSV文件的局限性
- CSV只能有效存储一维和二维数组
- np.savetxt()和np.loadtxt()只能有效存取一维和二维数组
3.4 多维数据的存取
Numpy的便捷文件读取
我们打开a.npy可以发现,该文件是以二进制形势存储的,在第一行文件以显式的方式将数组的源信息呈现了出来
4.Numpy的随机数函数
4.1 基本使用
rand(): 其中参数是维度,创建的数据时浮点数
randn():其中参数是维度,但是数据分布是标准正态分布
randint(low,high,shape):参数除了维度,还可以限定数据的范围
seed(s) : 通过设置相同的随机数种子s,我们可以得到相同的随机数数组
4.2 高级使用
shuffle(a):对最外维进行随机排列,改变原来数组的数据
permutation(a):在最外维产生一个乱序数组,但不改变原数组
choice(a,size,replace,p):表示从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为False
4.3 分布函数
5. Numpy的统计函数
对于mean()函数的参数axis
- axis = 0:压缩行,对各列求均值,返回1*n的矩阵
- axis = 1: 压缩列,对各行求均值,返回m*1的矩阵
对于average()的参数weights
- 对定轴axis的各位置元素赋予对应的权值,是一个列表
- 加权平均的计算:各位置元素*对应的元素/(权值之和)
6. Numpy的梯度函数
7. 图像的数组表示
from PIL import Image
import numpy as np
im = np.array(Image.open("D:\\Code\\Python\\PyTorch\\Data_analyze\\sun.jpg"))
print(im.shape, im.dtype)
(1281, 1280, 3) uint8
可以看到,图像是一个三维数组,维度分别是高度、宽度和像素RGB值。
8.图像的变换
既然图像可以用数组表示,数组又可以进行运算,运算后的数组就可以改变图像的形状。
步骤:
- 读入图像。
- 获得像素RGB值。
- 修改后保存为新的文件。
例一:图像色彩取反
import numpy as np
from PIL import Image
a = np.array(Image.open("D:\Code\Python\PyTorch\Data_analyze\sun.jpg"))
print(a.shape,a.dtype)
(1281, 1280, 3) uint8
b = [255,255,255]-a #求图像的补值
im = Image.fromarray(b.astype('uint8')) #生成图像文件
im.save("D:\Code\Python\PyTorch\Data_analyze\sun1.jpg") #保存新文件
例二:图像灰度化
.convert(‘L’)是将图片变成灰色,此时图像不是一个三维数组,而是一个二维数组。由下图输出可以看到灰度图已经没有rgb这一维了
import numpy as np
from PIL import Image
a = np.array(Image.open("C:/Users/Administrator/Pictures/timg1.jpg").convert('L'))
b = 255 - a #对灰度值取反,得到一个新数组b
im = Image.fromarray(b.astype('uint8'))
im.save("C:/Users/Administrator/Pictures/timg3.jpg")
例三:图片变灰效果淡
import numpy as np
from PIL import Image
a = np.array(Image.open("C:/Users/Administrator/Pictures/timg1.jpg").convert('L'))
c = (100/255)*a+150 #区间变换
im = Image.fromarray(b.astype('uint8'))
im.save("C:/Users/Administrator/Pictures/timg4.jpg")
例四:图片变灰效果深
import numpy as np
from PIL import Image
a = np.array(Image.open("C:/Users/Administrator/Pictures/timg1.jpg").convert('L'))
d = 255*(a/255)**2 #像素平方
im = Image.fromarray(b.astype('uint8'))
im.save("C:/Users/Administrator/Pictures/timg5.jpg")
标签:Python,Image,--,im,数组,np,import,Numpy From: https://www.cnblogs.com/epochal/p/numpy.html