numpy___数组/图像形状改变(transpose和reshape详解)
一、numpy如何表示行向量或者列向量
1、在 NumPy 中,一维数组本身没有行或列的方向概念,示例如下:
>>> a=np.array([1,2,3,4])
>>> print(a.shape)
(4,)
>>> print(a)
[1 2 3 4]
>>> b=a.T
>>> print(b.shape)
(4,)
>>> print(b)
[1 2 3 4]
>>>
>>>
>>>
2、形状(shape)
a=[[[0,1,2,3],[4,5,6,7],[8,9,10,11]],[[12,13,14,15],[16,17,18,19],[20,21,22,23]]]
npa=np.array(a)
print(npa)
print(npa.shape)
输出结果如下
[[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]]]
(2, 3, 4)
npa的形状是(2,3,4),代表两层,三行、四列,从左向右纬度依次下降;
由4个单元素扩展组成一纬数组(行),
由上述的行,扩展三行组成二纬数组(平面/矩阵)
由上述平面,空间扩展两层组成三维数组(空间)
npb=np.array(range(24)).reshape((2,3,4))
npb与上述npa一样,形状是(2,3,4)
3、图像的形状
import numpy as np
from PIL import Imagenew_image_a=Image.new("RGB",(5,6),color="white")
npimga=np.array(new_image_a)
print(npimga.shape)
print(npimga)
(5,6) 代表图片的宽和高(长和宽),宽5个像素,高6个像素,实际上是6行5列(与ndarray相反)
PIL/几乎所有图像处理库都是 size=(宽度,高度)
numpy 数组形状 shape=(行数,列数)=(高度,宽度)与图像相反
6曾层、5行、3列
输出结果如下
(6, 5, 3)
[[[255 255 255][255 255 255][255 255 255][255 255 255][255 255 255]][[255 255 255][255 255 255][255 255 255][255 255 255][255 255 255]][[255 255 255][255 255 255][255 255 255][255 255 255][255 255 255]][[255 255 255][255 255 255][255 255 255][255 255 255][255 255 255]][[255 255 255][255 255 255][255 255 255][255 255 255][255 255 255]][[255 255 255][255 255 255][255 255 255][255 255 255][255 255 255]]]
二、reshape详解
1、语法
numpy.reshape(a, newshape, order='C')
# 或使用数组方法
a.reshape(shape, order='C')
shape是一个元组类型,表示重塑形后的形状,从左到右维度依此下降。
m=(1,)
n=(2,3,4)
print(m+n)
print(n+m)
# 输出结果如下
(1, 2, 3, 4)
(2, 3, 4, 1)image.reshape((1,) + image.shape) # 相当于对原形状向高纬度扩充一维,维度大小为1
image.reshape(image.shape+(1,)) # 相当于对原形状向低纬度扩充一维,维度大小为1na.reshape(-1) # 将多维转变成一维(一行)
三、transpose
1、语法
numpy.transpose(a, axes=None)
# 或使用数组的成员函数
a.transpose(axes=None)
axes 整数元组,代表转换后的形状
2、实例详解
t=[[1,2,3],[4,5,6]]
t=np.array(t)
t1=t.transpose((0,1))
tuple1=(1,0)
t2=t.transpose(tuple1)
t3=t.T
print(t1)
# [[1 2 3]
# [4 5 6]]
print(t2)
# [[1 4]
# [2 5]
# [3 6]]print(t3)
# [[1 4]
# [2 5]
# [3 6]]
t.transpose(0,1,2,3,4,5) 保持数组形状不变
aix 0 代表沿着行的方向,1代表沿着列的方向,2代表沿着层的方向,3代表沿着块的行方向 对于哪几个纬度需要做转置,需要将对象索引的值互换即可
a[][][] 纬度索引由左到右,依次降低 a[0][1][3] 代表第一层,第二行,第四列的值
#0,1,2,3,4,5
#4,3,2,0,1,5
T代表转换后的数组,a代表转换前的数组;T[i][i][i][i][i][i]=a[x5][x4][x3][x2][x1][x0] [i]=x(tuple1[i]) i 代表位置
