← 返回首页
数组形状的操作
发表时间:2024-01-16 03:15:13
数组形状的操作

数组形状的操作。

1.数组形状的操作

常见的数组形状的操作有以下:

2.实例

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]]

小结:

  1. 数据的形状改变 (1)reshape和resize都是重新定义形状的,但是reshape不会修改数组本身,而是将修改后的结果返回回去,而resize是直接修改数组本身的 (2)flatten和ravel都是用来将数组变成一维数组的,并且他们都不会对原数组造成修改,但是flatten返回的是一个拷贝,所以对flatten的返回值的修改不会影响到原来数组,而ravel返回的是一个View,那么对返回值的修改会影响到原来数组的值
  2. 数据的叠加 (1)hstack代表在水平方向叠加,如果想要叠加成功,那么他们的行必须一致 (2)vastack代表在垂直方向叠加,如果想要叠加成功,那么他们的列必须一致 (3)concatenate可以手动指定axis参数具体在哪个方向叠加,如果axis=0,代表在水平方向叠加,如果axis=1,代表在垂直方向叠加,如果axis=None,那么会先进行叠加,再转化成一维数组
  3. 数组的切割 (1)hsplit代表在水平方向切割,按列进行切割。切割方式有两种,第一种就是直接指定平均切割成多少列,第二种就是指定切割的下标值 (2)vsplit代表在垂直方向切割,按行进行切割。切割方式与hsplit一致。 (3)split/array_split是手动的指定axis参数,axis=0代表按行进行切割,axis=1代表按列进行切割
  4. 矩阵转置 (1)可以通过ndarray.T的形式进行转置 (2)也可以通过ndarray.transpose()进行转置,这个方法返回的是一个View,所以对返回值上进行修改,会影响到原来的数组