数组形状的操作。
常见的数组形状的操作有以下:
1).数组形状的改变(reshape与resize/flatten与ravel)
import numpy as np
# reshape与resize都是用来修改数组形状的,但是存在不同
a1 = np.random.randint(0,10,size=(3,4))
print(a1)
# reshape是将数组转换成指定的形状,然后返回转换后的结果,对于原数组的形状是不会发生改变的
a2 = a1.reshape((2,6))
print(a2)
# resize是将数组转换成指定的形状,会直接修改数组本身,并且不会返回任何值
a1.resize((4,3))
print(a1)
# faltten与ravel都是将多维数组转换为一维数组,但是存在不同
a3 = np.random.randint(0,10,size=(3,4))
# flatten是将数组转换为一维数组后,然后将这个拷贝返回回去,然后后续对这个返回值进行修改不会影响之前的数组
a4 = a3.flatten()
a4[0] = 100
print(a3)
print(a4)
# 结果为:100
print(a4[0])
print(a3[0][0])
# ravel是将数组转换为一维数组后,将这个视图(引用)返回回去,后续对这个返回值进行修改会影响之前的数组
a5 = a3.ravel()
a5[0] = 1000
print(a3)
print(a5)
# 结果为:1000
print(a3[0,0])
# 结果为:1000
print(a5[0])
[[0 7 4 5]
[5 5 0 6]
[0 3 3 6]]
[[0 7 4 5 5 5]
[0 6 0 3 3 6]]
[[0 7 4]
[5 5 5]
[0 6 0]
[3 3 6]]
[[9 1 3 3]
[1 4 2 6]
[1 3 0 6]]
[100 1 3 3 1 4 2 6 1 3 0 6]
100
9
[[1000 5 6 7]
[ 7 9 5 6]
[ 8 3 7 9]]
[1000 5 6 7 7 9 5 6 8 3 7 9]
1000
1000
2).数组的叠加
#vstack代表在垂直方向叠加,如果想要叠加成功,那么列数必须一致
#hstack代表在水平方向叠加,如果想要叠加成功,那么行数必须一致
#concatenate可以手动的指定axis参数具体在哪个方向叠加
##(1)如果axis=0,代表在水平方向叠加
##(2)如果axis=1,代表在垂直方向叠加
##(3)如果axis=None,会先进行叠加,再转化为1维数组
vstack1 = np.random.randint(0,10,size=(3,4))
print(vstack1)
vstack2 = np.random.randint(0,10,size=(2,4))
print(vstack2)
#垂直方向叠加的两种方式
vstack3 = np.vstack([vstack1,vstack2])
print(vstack3)
vstack4 = np.concatenate([vstack1,vstack2],axis=0)
print(vstack4)
h1 = np.random.randint(0,10,size=(3,4))
print(h1)
h2 = np.random.randint(0,10,size=(3,1))
print(h2)
#水平方向叠加的两种方式
h3 = np.hstack([h2,h1])
print(h3)
h4 = np.concatenate([h2,h1],axis=1)
print(h4)
#先识别垂直叠加或水平叠加 后转换为一维数组
h5 = np.concatenate([h2,h1],axis=None)
print(h5)
[[4 5 0 9]
[2 7 4 6]
[1 3 8 5]]
[[5 3 9 5]
[3 6 6 9]]
[[4 5 0 9]
[2 7 4 6]
[1 3 8 5]
[5 3 9 5]
[3 6 6 9]]
[[4 5 0 9]
[2 7 4 6]
[1 3 8 5]
[5 3 9 5]
[3 6 6 9]]
[[4 3 5 1]
[9 6 5 9]
[0 7 8 8]]
[[5]
[1]
[9]]
[[5 4 3 5 1]
[1 9 6 5 9]
[9 0 7 8 8]]
[[5 4 3 5 1]
[1 9 6 5 9]
[9 0 7 8 8]]
[5 1 9 4 3 5 1 9 6 5 9 0 7 8 8]
3).数组的切割
#hsplit代表在水平方向切割,按列进行切割。
#hsplit切割方式两种,第一种直接指定平均切割成多少列,第二种是指定切割的下标值
#vsplit代表在垂直方向切割,按行进行切割。切割方式与hsplit相同
#split/array_split是手动的指定axis参数,axis=0代表按行进行切割,axis=1代表按列进行切割
hs1 = np.random.randint(0,10,size=(3,4))
print(hs1)
#水平方向平均分为2份 (要求列数可被此数整除)
print(np.hsplit(hs1,2))
#水平方向分为1,1,2列(在下标为1,2处切割)
print(np.hsplit(hs1,(1,2)))
vs1 = np.random.randint(0,10,size=(4,5))
print(vs1)
#垂直方向平均分为4份
print(np.vsplit(vs1,4))
#垂直方向分为1,2,1
print(np.vsplit(vs1,(1,3)))
#split/array_split(array,indicate_or_section,axis):用于指定切割方式,在切割的时候需要指定按照行还是列,axis=1代表按照列,axis=0代表按照行
#按列平均切割
print(np.split(hs1,4,axis=1))
#按行平均切割
print(np.split(vs1,4,axis=0))
[[2 1 5 5]
[8 0 0 8]
[1 1 1 8]]
[array([[2, 1],
[8, 0],
[1, 1]]), array([[5, 5],
[0, 8],
[1, 8]])]
[array([[2],
[8],
[1]]), array([[1],
[0],
[1]]), array([[5, 5],
[0, 8],
[1, 8]])]
[[1 0 2 4 3]
[3 4 1 1 3]
[9 8 8 5 3]
[4 0 4 0 8]]
[array([[1, 0, 2, 4, 3]]), array([[3, 4, 1, 1, 3]]), array([[9, 8, 8, 5, 3]]), array([[4, 0, 4, 0, 8]])]
[array([[1, 0, 2, 4, 3]]), array([[3, 4, 1, 1, 3],
[9, 8, 8, 5, 3]]), array([[4, 0, 4, 0, 8]])]
[array([[2],
[8],
[1]]), array([[1],
[0],
[1]]), array([[5],
[0],
[1]]), array([[5],
[8],
[8]])]
[array([[1, 0, 2, 4, 3]]), array([[3, 4, 1, 1, 3]]), array([[9, 8, 8, 5, 3]]), array([[4, 0, 4, 0, 8]])]
4).矩阵转置
#通过ndarray.T的形式进行转置
t1 = np.random.randint(0,10,size=(3,4))
print(t1)
#数组t1转置
print(t1.T)
#矩阵相乘
print(t1.dot(t1.T))
#通过ndarray.transpose()进行转置
#transpose返回的是一个View,所以对返回值上进行修改会影响到原来的数组。
t2 = t1.transpose()
t2[0][0]=100
print(t2)
print(t1)
[[4 3 9 1]
[2 1 3 6]
[5 1 7 7]]
[[4 2 5]
[3 1 1]
[9 3 7]
[1 6 7]]
[[107 44 93]
[ 44 50 74]
[ 93 74 124]]
[[100 2 5]
[ 3 1 1]
[ 9 3 7]
[ 1 6 7]]
[[100 3 9 1]
[ 2 1 3 6]
[ 5 1 7 7]]
小结: