python常用功能代码

此贴会应该会经常更新,旨在收集一些python常用功能代码片段。博客会以一个个小demo形式展开,简洁明了。

一.numpy篇

demo1: 创建一个二维数组

demo2: 直接修改数组的dtype类型,会使得数组长度变长,增加(修改前的数据位数表示/修改后的数据位数表示)个倍数,比如原来的是float64, 转换成uint8后,长度会增加64/8倍(一般此效果不是我们想要的

demo3: 验证直接==赋值是一种浅拷贝,一个变量值发生变化会影响到另一个变量值,copy方式是深拷贝

demo4:从原来数组中截取一部分数据为最新数组,最新数组值发生变化后,原来数组中的值也会发生变化

demo5: 通过astype方式进行类型转化(推荐

demo6: 从一个numpy数组去构造另一个,来使得数组类型发生变化(推荐

demo7: 将一个含有负数的float数组,通过numpy astype方式转化为uint8,数据并没有呈现线性拉伸到0~255范围内;这里手动实现了一个线性拉伸到uint8的代码片段

如下是7个demo的代码:

import numpy as np
import cv2
import torch

print("demo1:创建一个二维数组")
src = np.array([[-0.5,0.5,1.5],[-1,0.8,1.2],[1,1.6,2]])
src_copy = src.copy()
original = src.copy()
print(src)
print(src.shape)
print(src.dtype)
print(" ")

print("demo2:直接更改类型")
src1 = src
src1.dtype = np.uint8
print(src1)
print(src1.shape)
print(src1.dtype)
print(" ")

print("demo3:验证直接=赋值是浅拷贝,内存地址一样,一个变量值变了,另一个变量值不变;前面copy方式则是深拷贝,各有各的值,互不影响")
src2 = src
#src2.astype(np.uint8)
print(src2)
print(src2.dtype)
print(src_copy)
print(" ")

print("demo4:截取一部分数据")
src3 = src_copy[0:2,0:2]
print(src3)
print(src3.dtype)
src4 = src3.copy()
src4.dtype = np.uint8  #如果这里直接进行sr3.dtype = np.uint8,则会报错
print(src4)
src3[0,0] = -0.3
print(src3)
#可以看到即使是截取获取数据,也是浅拷贝,src_copy的值也变化了
print(src_copy)
print(" ")

print("demo5:astype方式转变")
original1 = original.copy();
original1.astype(np.uint8)
print(original1)
print(original1.dtype)
#需要进行一下赋值操作给到a,此时a的类型就变化了
a=original1.astype(np.uint8)
print(a)
print(a.dtype)
print(" ")

print("demo6:从一个numpy数组去构造另一个")
original2 = original.copy()
b = np.array(original2, dtype=np.uint8)
print(b)
print(" ")


print("demo7:numpy数组减去一个常数")
original3 = original.copy()
#获取最大最小值
max = np.max(original3)
print(max)

min = np.min(original3)
print(min)

#数组减去最小值
print(original3)
sub = original3 - min
print(sub)

#压缩到0~1范围
ratio = sub/(max -min)
print(ratio)

#扩展到0~255范围内
expand = ratio * 255
print(expand)

final = expand.astype(np.uint8)
print(final)
print(" ")

print("demo7: format")
image = cv2.imread("2008_002682.jpg")
print(image.shape)
print(image.dtype)

image1 = torch.from_numpy(image) #pytorch -> numpy
print(image1.shape)

image2 = image1.numpy() #numpy -> pytorch
print(image2.shape)

image3 = image2.transpose(2,1,0) # 2轴变为了第一个维度,0轴变成了最后
print(image3.shape)






 如下是执行后的结果:

/home/sxhlvye/anaconda3/envs/pytorch-yolo/bin/python /home/sxhlvye/Trial/yolov3-9.5.0/test_numpy.py
demo1:创建一个二维数组
[[-0.5  0.5  1.5]
 [-1.   0.8  1.2]
 [ 1.   1.6  2. ]]
(3, 3)
float64
 
demo2:直接更改类型
[[  0   0   0   0   0   0 224 191   0   0   0   0   0   0 224  63   0   0
    0   0   0   0 248  63]
 [  0   0   0   0   0   0 240 191 154 153 153 153 153 153 233  63  51  51
   51  51  51  51 243  63]
 [  0   0   0   0   0   0 240  63 154 153 153 153 153 153 249  63   0   0
    0   0   0   0   0  64]]
(3, 24)
uint8
 
demo3:验证直接=赋值是浅拷贝,内存地址一样,一个变量值变了,另一个变量值不变;前面copy方式则是深拷贝,各有各的值,互不影响
[[  0   0   0   0   0   0 224 191   0   0   0   0   0   0 224  63   0   0
    0   0   0   0 248  63]
 [  0   0   0   0   0   0 240 191 154 153 153 153 153 153 233  63  51  51
   51  51  51  51 243  63]
 [  0   0   0   0   0   0 240  63 154 153 153 153 153 153 249  63   0   0
    0   0   0   0   0  64]]
uint8
[[-0.5  0.5  1.5]
 [-1.   0.8  1.2]
 [ 1.   1.6  2. ]]
 
demo4:截取一部分数据
[[-0.5  0.5]
 [-1.   0.8]]
float64
[[  0   0   0   0   0   0 224 191   0   0   0   0   0   0 224  63]
 [  0   0   0   0   0   0 240 191 154 153 153 153 153 153 233  63]]
[[-0.3  0.5]
 [-1.   0.8]]
[[-0.3  0.5  1.5]
 [-1.   0.8  1.2]
 [ 1.   1.6  2. ]]
 
demo5:astype方式转变
[[-0.5  0.5  1.5]
 [-1.   0.8  1.2]
 [ 1.   1.6  2. ]]
float64
[[  0   0   1]
 [255   0   1]
 [  1   1   2]]
uint8
 
demo6:从一个numpy数组去构造另一个
[[  0   0   1]
 [255   0   1]
 [  1   1   2]]
 
demo7:numpy数组减去一个常数
2.0
-1.0
[[-0.5  0.5  1.5]
 [-1.   0.8  1.2]
 [ 1.   1.6  2. ]]
[[0.5 1.5 2.5]
 [0.  1.8 2.2]
 [2.  2.6 3. ]]
[[0.16666667 0.5        0.83333333]
 [0.         0.6        0.73333333]
 [0.66666667 0.86666667 1.        ]]
[[ 42.5 127.5 212.5]
 [  0.  153.  187. ]
 [170.  221.  255. ]]
[[ 42 127 212]
 [  0 153 187]
 [170 221 255]]
 
demo7: format
(500, 375, 3)
uint8
torch.Size([500, 375, 3])
(500, 375, 3)
(3, 375, 500)

Process finished with exit code 0

继续实验,demo图片的HWC和CHW两种表示方法

import numpy as np

#array = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
array = np.arange(24).reshape((4,2,3))
print(array.shape)
print(array)

array1 = array.transpose(2,0,1)
print(array1.shape)
print(array1)

执行结果:

/home/sxhlvye/anaconda3/envs/testOpenVINO/bin/python3.6 /home/sxhlvye/trial4/test_numpy.py
(4, 2, 3)
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]

 [[12 13 14]
  [15 16 17]]

 [[18 19 20]
  [21 22 23]]]
(3, 4, 2)
[[[ 0  3]
  [ 6  9]
  [12 15]
  [18 21]]

 [[ 1  4]
  [ 7 10]
  [13 16]
  [19 22]]

 [[ 2  5]
  [ 8 11]
  [14 17]
  [20 23]]]

Process finished with exit code 0

 

 二. 图像篇

拿下面的图片做实验

demo1:简单展示opencv、matplotlib、PIL Image(opencv读到的数据是numpy数组表示的)

import torch
import torchvision
from PIL import Image
import matplotlib.pyplot as plt
import time
import numpy as np
import cv2

print("demo1:简单展示opencv、matplotlib、PIL Image")
#读图片
image = cv2.imread("2008_002682.jpg") #numpy数据结构
print(image.shape)
cv2.imshow("image",image)
cv2.waitKey(0)                        #opencv方式显示

plt.imshow(image)                     #matplotlib方式显示
plt.show()

x = Image.fromarray(image)       #numpy -> PIL
x.show()                              #通过PIL Image方式显示

img = Image.open("2008_002682.jpg")   #PIL Image读取图片
print(img.size)
print(type(img))

img2 = np.array(img)           #PIL -> numpy
print(type(img2))

执行后结果

/home/sxhlvye/anaconda3/envs/pytorch-yolo/bin/python /home/sxhlvye/Trial/yolov3-9.5.0/test_image.py
demo1:简单展示opencv、matplotlib、PIL Image
(500, 375, 3)
(375, 500)
<class 'PIL.JpegImagePlugin.JpegImageFile'>
<class 'numpy.ndarray'>

Process finished with exit code 0

 demo2: 显示下面博客中img_normalize图像,即标准化后的图片

使用Pytorch自带模型预测图片_jiugeshao的专栏-CSDN博客pytorch自带了大量内置模型,相关介绍可见如下博客pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式_shuijinghua的博客-CSDN博客_pth和ptPytorch的内置模型_博客-CSDN博客_pytorch内置模型pytorch框架--网络方面--pytorch自带模型(增、改)_雪剑封心-CSDN博客pytorch 如何调用cuda_将Pytorch模型从CPU转换成GPU的实现方法_扎波罗热人的博客-CSDN博客Pytorch 高效使用GPU..https://blog.csdn.net/jiugeshao/article/details/123318715?spm=1001.2014.3001.5501基本过程就是拿到img_normalize后,先将一个维度,此时为CHW表示,转化为numpy后,再做一个通道转换成HWC表示,再线性拉伸到0~255范围内

import torch
import torchvision
from PIL import Image
from torchvision import transforms
import torchvision.models as models
import matplotlib.pyplot as plt
import numpy as np
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(), normalize]
)

img = Image.open("2008_002682.jpg")
print(img.size)

# 对图像进行归一化
img_p = transform(img)
print(img_p.shape)

# 增加一个维度
img_normalize = torch.unsqueeze(img_p, 0).cuda()
print("img_normalize shape:", img_normalize.shape)

img_normalize_reduce = img_normalize[0,:]
print("img_normalize_reduce shape:", img_normalize_reduce.shape)

#转化为numpy数据
img_normalize_np = img_normalize_reduce.cpu().data.numpy()
print(img_normalize_np.shape)
print(img_normalize_np.dtype)

#转化通道
img_normalize_convert = img_normalize_np.transpose(1,2,0)
print(img_normalize_convert.shape)

max = np.max(img_normalize_convert)
min = np.min(img_normalize_convert)
sub = img_normalize_convert - min
ratio = sub / (max - min)
expand = ratio * 255
final = expand.astype(np.uint8)
print(final.dtype)
print(np.median(final))
print(np.max(final))
print(np.mean(final))
print(np.min(final))

x = Image.fromarray(final)
x.show()
print(x.size)






执行后结果:

/home/sxhlvye/anaconda3/envs/pytorch-yolo/bin/python /home/sxhlvye/Trial/yolov3-9.5.0/test_vgg16.py
(375, 500)
torch.Size([3, 224, 224])
img_normalize shape: torch.Size([1, 3, 224, 224])
img_normalize_reduce shape: torch.Size([3, 224, 224])
(3, 224, 224)
float32
(224, 224, 3)
uint8
102.0
255
109.20800116921768
0
(224, 224)

Process finished with exit code 0

 可以看到其还能表示一只猫咪,图像大小变为224*224了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹叶青lvye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值