numpy数组的创建
数组的创建以及常用操作
一、特殊的创建数组
import numpy as np
1、 arange 起始位置,终止位置,步长
arr3 = np.arange(1, 10,2)
print(arr3)
[1 3 5 7 9]
2、 linspace 起始位置,终止位置,显示的个数
给出初始位置,差数,显示个数,求最后一个数
起始位置 + (个数-1)*(差数) = 最后一个数
# a1=8 d=-1 n=7
# # 8 + (7-1)*(-1) = 2
arr5 = np.linspace(8, 2, 7)
arr4 = np.linspace(1,10,5)
print(arr4, arr5)
[ 1. 3.25 5.5 7.75 10. ] [8. 7. 6. 5. 4. 3. 2.]
3、 logspce 等比数列
起始指数, 最后一个数的指数 显示的个数
start, stop, num=50, endpoint=True, base=10.0, dtype=None,axis=0):
起始数, 倍数, 显示个数
# a1=3, q=9, n=6
# 最后一个数 = a1*a1**(n-1) = 3 (11)
# 得出底数为3, base = 3, ze logx3 = a > 第一个为 1, 最后一个 11, 显示个数6
arr6 = np.logspace(1,11,6,base=3)
print(arr6)
[3.00000e+00 2.70000e+01 2.43000e+02 2.18700e+03 1.96830e+04 1.77147e+05]
4、全一数组
np.ones
# arr7 = np.ones((3,4))
print(arr7)
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
5、全 0 数组
np.zeros
arr8 = np.zeros((3,4))
print(arr7, arr8)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
6、单位数组 # 对角线为 1
np.eye
arr9 = np.eye(3)
print(arr9)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
7、对角数组
np.diag
arr10 = np.diag([1,2,3,4])
print(arr10)
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
二、随机数组
1 随机数组 random 随机100个数,数在0-1之间, 一维数组
random.random
arr11 = np.random.random(10)
print(arr11)
[0.94291171 0.37437134 0.95882402 0.53468268 0.61535727 0.99573457
0.40829533 0.54493658 0.26366464 0.30122991]
2 均匀分布: 每个区间内的随机数,出现的概率都均匀分布
random.rand
# random.rand
arr12 = np.random.rand(10)
print(arr12)
[0.54421722 0.88963632 0.55908979 0.75682079 0.33739974 0.06608583
0.87322233 0.72741851 0.20770551 0.1719531 ]
3 正态分布: 在数轴中,会显示一个峰值,指定是数据出现的概率,峰值越高,概率则越高,临近0的位置概率越高
random.randn
# 有正 有负
arr13 = np.random.randn(50)
print(arr13)
[ 1.26533955 -1.78556978 0.93679018 -0.44488995 2.71992622 2.23053563
-0.50636456 1.43736733 1.456863 -0.29957034 0.79827706 0.78054322
0.62672284 1.16400739 -0.7550562 -1.95943291 -1.17037617 1.53813303
-0.04651108 -0.763941 -0.62367491 0.69005622 1.11434205 -0.48368366
0.49187281 -0.10056911 -0.8721509 0.66926024 -0.2262314 -0.20382128
-1.60633907 1.08232747 0.9563421 -1.00991936 -0.15346309 0.80780588
-2.30794637 1.16900935 -0.10164755 -0.4816431 1.44266502 -0.97043795
1.50490985 -0.51082826 -1.84256456 0.80230763 0.56863096 2.22493269
-0.53022144 -1.22730517]
4 随机整数的生成 最小值 最大值 显示的个数 不包含最大值
random.randint
arr14 = np.random.randint(2, 8,size =[4,4])
print(arr14)
[[3 2 5 7]
[4 7 4 3]
[2 3 7 4]
[5 7 2 2]]
三、矩阵形态装换
1 重置数组结构 将一维数组,转换为二维数组
arr_1.reshape
arr_1 = np.arange(10)
print(arr_1)
arr_2 = arr_1.reshape((2, 5))
print(arr_2)
[0 1 2 3 4 5 6 7 8 9]
[[0 1 2 3 4]
[5 6 7 8 9]]
2 ravel 展平数组 | flatten order=‘C’| ‘F’: 就是将二维数组,转换为一维数组
arr_3 = arr_2.ravel()
print(arr_3)
[0 1 2 3 4 5 6 7 8 9]
3 flatten order=‘C’| ‘F’,将二维数组,转换为一维数组,可以指定
# flatten order='C' 按照一行进行展平,横向展平 order='F':按照列依次进行展平,纵向展平
arr_4 = arr_2.flatten('C')
arr_5 = arr_2.flatten('F')
print(arr_4, arr_5)
[0 1 2 3 4 5 6 7 8 9] [0 5 1 6 2 7 3 8 4 9]
四、堆叠的方法: 将两个转换为一个
1 横向堆叠,需要行数一样, 参数为元组
np.hstack
arr_6 = np.zeros((3,4))
arr_7 = np.ones((3,4))
print(arr_6, arr_7)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
# # 横向堆叠,需要行数一样, 参数为元组
arr_8 = np.hstack((arr_6, arr_7))
print(arr_8)
[[0. 0. 0. 0. 1. 1. 1. 1.]
[0. 0. 0. 0. 1. 1. 1. 1.]
[0. 0. 0. 0. 1. 1. 1. 1.]]
2 纵向堆叠,需要列数相同
np.vstack
arr_9 = np.vstack((arr_6, arr_7))
print(arr_9)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
3 数组的合并,拼接 concatenate
# axis=0 :表示的纵轴,0.1.2.3 axis=1 表示的横轴, 0.1.2.3
arr_10 = np.concatenate((arr_6, arr_7), axis=1)
print(arr_10)
[[0. 0. 0. 0. 1. 1. 1. 1.]
[0. 0. 0. 0. 1. 1. 1. 1.]
[0. 0. 0. 0. 1. 1. 1. 1.]]
4 concatenate 与 hstack vstack 的区别
当数组为一维数组时, 只有一个axis=0 当前有两个一维数组堆叠,使用concatenate,需要考虑轴方向:1/0,
但是一维数组默认只有0,使用concatenate进行axi=0想要纵向堆叠,会得不到想要的结果,会得出的横向堆叠的情况
hstack | vstack 不考虑轴方向,直接将两个数组堆叠,并且 vstack会将一维数组转换为二维数组,再进行堆叠
ar1 = np.array([1,2,3,4])
ar2 = np.array([0,0,2,1])
ar3 = np.concatenate((ar1, ar2), axis=0)
ar4 = np.vstack((ar1,ar2))
print(ar3, ar4)
[1 2 3 4 0 0 2 1]
[[1 2 3 4]
[0 0 2 1]]
五、数组的分割, 对行(列)进行分割
1 数组的分割,横向分割,列的索引进行分割, 从 0 开始, 左开右闭原则 :2 2:4 4:7
ar5 = np.hsplit(arr_10, 4)
ar6 = np.hsplit(arr_10, np.array([2, 4, 7]))
ar7 = np.hsplit(arr_10, np.array([4,6,7]))
print(ar6)
[array([[0., 0.],
[0., 0.],
[0., 0.]]), array([[0., 0.],
[0., 0.],
[0., 0.]]), array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]), array([[1.],
[1.],
[1.]])]
2 数组的分割,纵向分割
参数中直接加数字,就是将数组,平均分割为 2 份
np.array([2, 4, 7],指定索引行进行分割
ar5 = np.hsplit(arr_10, 4)
ar6 = np.hsplit(arr_10, np.array([2, 4, 7]))
ar7 = np.hsplit(arr_10, np.array([4,6,7]))
print(ar6)
[array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]), array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])]
[array([[0., 0., 0., 0.],
[0., 0., 0., 0.]]), array([[0., 0., 0., 0.],
[1., 1., 1., 1.]]), array([[1., 1., 1., 1.],
[1., 1., 1., 1.]]), array([], shape=(0, 4), dtype=float64)]
3 分割和拼接,对轴进行分割,需要注意轴的问题,如果是一维数组,就没有axis = 1
ar9 = np.split(arr_9, 3, axis=0)
print(ar9)
[array([[0., 0., 0., 0.],
[0., 0., 0., 0.]]), array([[0., 0., 0., 0.],
[1., 1., 1., 1.]]), array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])]