这些库或者对象具有相似功能但具体操作方式又有所不同,本文将从创建(读取,存储),属性(大小),操作(切片,reshape)和相互转换方面,进行汇总介绍。
这个是 python 高性能计算的基础,几乎所有包的实际数据存储本质都是 ndarray 的。
ndarray 的创建一般使用 numpy 提供的几个常用函数 zeros(),ones() 等
import numpy as np
a = np.zeros((3,4,5))
a_like = np.zeros_like(a)
l = np.arange(10)
ndarray 很少涉及序列化和反序列化,这里直接给出操作方法
# 默认情况下,数组以未压缩的原始二进制格式保存在扩展名为npy的文件中
np.save("filename.npy",a)
b = np.load("filename.npy")
# 将数组写入以某种分隔符隔开的文本文件中,默认分隔符为空格
np.savetxt("filename.txt",a)
b = numpy.loadtxt("filename.txt", delimiter=',')
# 使用数组的 tofile 函数可以方便地将数组中数据以二进制的格式写进文件
# 需要注意的是读取时,需要指定存储是相同的数据类型,否则读取数据不正确
# 同时,读取的数据是一维的,需要人为 reshape
a.tofile("filename.bin")
b = np.fromfile("filename.bin",dtype = **)
除此之外,还有 dump(),dumps()
# 转换数组的数据类型
a.astype(np.uint8)
# 返回该数组的浅复制
a.copy()
# 将该数组变换为新的形状,也可以通过直接修改 shape 属性实现
a.reshape((12, 5))
# 交换该数组的坐标轴
a.transpose((2, 0, 1))
# 在指定的坐标轴方向上复制
a=np.arange(4).reshape(2,2)
a=a.repeat(2,axis=1)
# ouput
a = [[0, 0, 1, 1],
[2, 2, 3, 3]]
ndarray 的元素获取主要基于切片操作进行
a = np.arange(10).reshape((2,5))
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
a[1, 3] # == a[1][3]
8
a[:, ::-2]
array([[4, 2, 0],
[9, 7, 5]])
img = cv2.imread('img.png')
cv2.imshow('img', img)
img = cv2.imwrite('img_copy.png', img)
Opencv 打开图片之后就是直接以 ndarray 进行存储,因此所有操作与 ndarray 完全相同。同时也可以直接创建 ndarray 对象当做 Opencv 图片处理。因此对于属性,操作和数据转换不再介绍。
需要注意的是,Opencv 在进行图像存储时使用的通道顺序是 BGR,与后面介绍的和通常使用的 RGB 有差异。
from PIL import Image
img = Image.open('img.png') # 默认为 RGB
img.show()
img.save('img_copy.png')
# 转换图片存储模式
img.convert('P')
# 图像裁剪
img.crop((10, 10, 100, 100)) # left, top, right, bottom
# 获取某个点的像素值
img.getpixel((5, 10)) # width 5, height 10
img.putpixel((5, 10), (255, 255, 255)) # if RGB
import torch
t = torch.zeros((5, 5, 5))
# 在制定 GPU 上创建与 data 一样的类型
torch.tensor(data, dtype=torch.float64, device=torch.device('cuda:0'))
gpu_tensor.size() # 尺寸,tuple 的 size 对象
gpu_tensor.dim() # 维度
gpu_tensor.numel() # 所有元素个数
b = a.clone() # 数据拷贝