NumPy库004数组形状的操作
1、reshape和resize
将数组变成其他形状
-
reshape不会修改原数组的形状,而是返回一个新数组
-
resize直接修改原来的数组
import numpy as np
a=np.random.randint(0,10,size=(3,4))
print(a)
'''[[2 5 8 2]
[0 8 2 6]
[5 2 0 7]]'''
b=a.reshape((2,6))
print(a)
'''[[2 5 8 2]
[0 8 2 6]
[5 2 0 7]]'''
print(b)
'''[[2 5 8 2 0 8]
[2 6 5 2 0 7]]'''
a.resize((2,6))
print(a)
'''[[2 5 8 2 0 8]
[2 6 5 2 0 7]]'''
2、flatten和ravel
两个方法都是讲多维数组转换成一维数组,两个方法都不会改变原数组
- flatten返回的是拷贝,对拷贝进行修改会影响原数组
- ravel得到的结果进行修改时,会影响原来的数组(类似返回的是一个引用,或者指针)
import numpy as np
a=np.zeros((3,4))
print(a)
'''[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]'''
b=a.flatten()
print(a)
'''[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]'''
b[2:8]=1
print(b)
# [0. 0. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.]
print(a)
'''[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]'''
c=a.ravel()
print(a)
'''[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]'''
c[2:8]=1
print(c)
# [0. 0. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.]
print(a)
'''[[0. 0. 1. 1.]
[1. 1. 1. 1.]
[0. 0. 0. 0.]]'''
3、不同数组的组合
- 垂直叠加vstack:列数一样
- 水平叠加hstack:行数一样
- concatenate((),axis=):可以手动的指定在某个方向叠加
- axis=0:垂直
- axis=1:水平
- axis=None:先在某个方向上叠加,再转换成一维数组
import numpy as np
#垂直方向叠加,列数相同
a1=np.random.randint(0,10,size=(3,4))
print(a1)
'''[[1 8 2 9]
[2 8 1 5]
[9 2 0 9]]'''
a2=np.random.randint(0,10,size=(2,4))
print(a2)
'''
[[5 0 3 3]
[8 6 9 0]]'''
a3=np.vstack([a1,a2])
print(a3)
'''
[[1 8 2 9]
[2 8 1 5]
[9 2 0 9]
[5 0 3 3]
[8 6 9 0]]'''
c1=np.concatenate((a1,a2),axis=0)
print(c1)
'''
[[1 8 2 9]
[2 8 1 5]
[9 2 0 9]
[5 0 3 3]
[8 6 9 0]]'''
print(np.concatenate((a1,a2),axis=None))
# [1 8 2 9 2 8 1 5 9 2 0 9 5 0 3 3 8 6 9 0]
#水平叠加,行数必须相同,否则报错
h1=np.random.randint(0,10,size=(3,4))
print(h1)
'''[[5 4 8 8]
[3 0 3 0]
[8 2 8 9]]'''
h2=np.random.randint(0,10,size=(3,1))
print(h2)
'''
[[0]
[2]
[5]]'''
h3=np.hstack([h1,h2])#行数不一致会报错
print(h3)
'''
[[5 4 8 8 0]
[3 0 3 0 2]
[8 2 8 9 5]]'''
c2=np.concatenate((h1,h2),axis=1)
print(c2)
'''
[[5 4 8 8 0]
[3 0 3 0 2]
[8 2 8 9 5]]'''
print(np.concatenate((h1,h2),axis=None))
'''[5 4 8 8 3 0 3 0 8 2 8 9 0 2 5]'''
#concatenate((,),axis=)axis=0是水平方向,axis=1是垂直方向,axis=None:先叠加,再变成一维数组
超过两个也可以哦~
import numpy as np
a1=np.random.randint(0,10,size=(3,4))
print(a1)
'''[[2 4 0 4]
[6 5 0 1]
[5 8 1 5]]'''
a3=np.random.randint(0,10,size=(1,4))
print(a3)
# [[6 5 5 3]]
a2=np.random.randint(0,10,size=(2,4))
print(a2)
'''[[9 2 4 0]
[7 0 9 2]]'''
a4=np.vstack([a1,a2,a3])
print(a4)
'''
[[2 4 0 4]
[6 5 0 1]
[5 8 1 5]
[9 2 4 0]
[7 0 9 2]
[6 5 5 3]]'''
c1=np.concatenate((a1,a2,a3),axis=0)
print(c1)
'''
[[2 4 0 4]
[6 5 0 1]
[5 8 1 5]
[9 2 4 0]
[7 0 9 2]
[6 5 5 3]]'''
print(np.concatenate((a1,a2,a3),axis=None))
# [2 4 0 4 6 5 0 1 5 8 1 5 9 2 4 0 7 0 9 2 6 5 5 3]
4、数组的切割
-
hsplit (a,x) a:数组,x:平均分成x份(一定是平均分)
hsplit(a,(1,2)) a:数组, (1,2)在第一列和第二列的位置切一刀
-
vsplit 同上
-
split/array_split(array,切几分或在拿切,axis=) axis=1:水平 axis=0:垂直
import numpy as np
a1=np.random.randint(0,10,size=(4,3))
print(a1)
'''[[6 9 7]
[7 4 0]
[3 4 2]
[2 7 2]]'''
print(np.vsplit(a1,2))#横着切
'''[array([[6, 9, 7],
[7, 4, 0]]), array([[3, 4, 2],
[2, 7, 2]])]'''
print(np.vsplit(a1,(1,2)))#横着切
'''[array([[6, 9, 7]]), array([[7, 4, 0]]), array([[3, 4, 2],
[2, 7, 2]])]
'''
print(np.split(a1,2,axis=0))
'''[array([[6, 9, 7],
[7, 4, 0]]), array([[3, 4, 2],
[2, 7, 2]])]
'''
print(np.split(a1,(1,2),axis=0))
'''[array([[6, 9, 7]]), array([[7, 4, 0]]), array([[3, 4, 2],
[2, 7, 2]])]'''
b1=np.random.randint(0,10,size=(3,6))
print(b1)
'''[[3 6 5 7 4 7]
[1 1 2 5 2 1]
[0 2 9 0 9 3]]'''
print(np.hsplit(b1,2))#竖着切
'''[array([[3, 6, 5],
[1, 1, 2],
[0, 2, 9]]), array([[7, 4, 7],
[5, 2, 1],
[0, 9, 3]])]'''
print(np.hsplit(b1,(1,3,4)))#竖着切
'''[array([[3],
[1],
[0]]), array([[6, 5],
[1, 2],
[2, 9]]), array([[7],
[5],
[0]]), array([[4, 7],
[2, 1],
[9, 3]])]
'''
print(np.split(b1,2,axis=1))
'''[array([[3, 6, 5],
[1, 1, 2],
[0, 2, 9]]), array([[7, 4, 7],
[5, 2, 1],
[0, 9, 3]])]'''
print(np.split(b1,(1,3,4),axis=1))
'''[array([[3],
[1],
[0]]), array([[6, 5],
[1, 2],
[2, 9]]), array([[7],
[5],
[0]]), array([[4, 7],
[2, 1],
[9, 3]])]'''
注意:
- vsplit,axis=0代表垂直的意思,但是是横着切
- hsplit,axis=1竖着切
5、数组的转置
- T:返回转置的结果,不改变原来的数组
- a.transport():返回转置的结果,但是是一个View(引用、指针类似),在对这个结果进行操作时会改变原来的数组。
import numpy as np
a1=np.random.randint(0,10,size=(4,3))
print(a1)
'''[[0 7 1]
[5 1 8]
[1 3 7]
[1 6 4]]'''
#.T
a2=a1.T
print(a2)
'''
[[0 5 1 1]
[7 1 3 6]
[1 8 7 4]]'''
a2[0]=99
print(a2)
'''[[99 99 99 99]
[ 7 1 3 6]
[ 1 8 7 4]]'''
print(a1)
'''[[99 7 1]
[99 1 8]
[99 3 7]
[99 6 4]]'''
#.transpose()方法
a1=np.random.randint(0,10,size=(3,3))
a3=a1.transpose()
print(a3)
'''[[2 7 8]
[8 7 0]
[1 0 8]]'''
a3[0]=99
print(a3)
'''[[99 99 99]
[ 8 7 0]
[ 1 0 8]]'''
print(a1)
'''[[99 8 1]
[99 7 0]
[99 0 8]]
'''
#这个并没有看出来.T和transpose有啥区别呀,这能了解各自的用法
#。。。