1. numpy中数组/矩阵的转置
转置是数组/矩阵的一种变换,简单的说就是在数组/矩阵对角线方向交换数据。
1.1 交换轴的位置 t.swapaxes(axis1,axis0)
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = a.swapaxes(1, 0)
print("转置后得到a1:\n", a1)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
转置后得到a1:
[[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]
[ 6 12 18]]
1.2 转置方法一 t.transpose()
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a2 = a.transpose()
print("转置后得到a2:\n", a2)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
转置后得到a2:
[[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]
[ 6 12 18]]
1.3 转置方法二 t.T
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a3 = a.T
print("转置后得到a3:\n", a3)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
转置后得到a3:
[[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]
[ 6 12 18]]
2. numpy中数组/矩阵的索引和切片
2.1 取数组/矩阵中的一行/一列
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = a[1]
print("取一行得到的结果:\n", a1)
a2 = a[:, 1]
print("取一列得到的结果:\n", a2)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
取一行得到的结果:
[ 7 8 9 10 11 12]
取一列得到的结果:
[ 2 8 14]
2.2 连续取数组/矩阵中的多行/多列
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = a[1:3]
print("取多行得到的结果:\n", a1)
a2 = a[:, 1:3]
print("取多列得到的结果:\n", a2)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
取一行得到的结果:
[[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
取一列得到的结果:
[[ 2 3]
[ 8 9]
[14 15]]
2.3 取数组/矩阵中不连续的多行/多列
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = a[[0, 2]]
print("取不连续多行得到的结果:\n", a1)
a2 = a[:, [0, 2, 5]]
print("取不连续多列得到的结果:\n", a2)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
取不连续多行得到的结果:
[[ 1 2 3 4 5 6]
[13 14 15 16 17 18]]
取不连续多列得到的结果:
[[ 1 3 6]
[ 7 9 12]
[13 15 18]]
2.4 取单行、单列的交点
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = a[1, 2]
print("取不连续多行得到的结果:\n", a1)
print(type(a1))
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
取不连续多行得到的结果:
9
<class 'numpy.int32'>
2.5 取多行、多列的交点
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = a[0:2, 1:4]
print("取连续多行、多列交叉区域得到的结果:\n", a1)
print(type(a1))
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
取连续多行、多列交叉区域得到的结果:
[[ 2 3 4]
[ 8 9 10]]
<class 'numpy.ndarray'>
2.6 取不连续多行、多列的相交点
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = a[[0,2,1], [1,3,5]]
print("取不连续多行、多列交叉点得到的结果:\n", a1)
print(type(a1))
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
取不连续多行、多列交叉点得到的结果:
[ 2 16 12]
<class 'numpy.ndarray'>
3. numpy中数组/矩阵中元素值的修改
3.1 修改数组/矩阵单个元素值、某行、某列的值
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a[0, :] = 999999
print("修改第0行的值得到的结果:\n", a)
a[:, 0:2] = 0
print("修改第0列、第1列的值得到的结果:\n", a)
a[0,0]=6666666
print("修改单个元素的值得到的结果:\n",a)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
修改第0行的值得到的结果:
[[999999 999999 999999 999999 999999 999999]
[ 7 8 9 10 11 12]
[ 13 14 15 16 17 18]]
修改第0列、第1列的值得到的结果:
[[ 0 0 999999 999999 999999 999999]
[ 0 0 9 10 11 12]
[ 0 0 15 16 17 18]]
修改单个元素的值得到的结果:
[[6666666 0 999999 999999 999999 999999]
[ 0 0 9 10 11 12]
[ 0 0 15 16 17 18]]
3.2 根据条件修改数组/矩阵中元素的值
3.2.1 一般条件
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a[a > 3] = 0
print("根据修改条件得到的结果:\n", a)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
根据修改条件得到的结果:
[[1 2 3 0 0 0]
[0 0 0 0 0 0]
[0 0 0 0 0 0]]
3.2.2 三元条件
a1 = np.where(条件,赋值1,赋值2)
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = np.where(a < 7, 0, 7)
print("根据三元修改条件得到的结果:\n", a1)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
根据三元修改条件得到的结果:
[[0 0 0 0 0 0]
[7 7 7 7 7 7]
[7 7 7 7 7 7]]
3.3 数组/矩阵的布尔索引
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = a < 9
print("a的布尔索引:\n", a1)
print(a1.dtype)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
a的布尔索引:
[[ True True True True True True]
[ True True False False False False]
[False False False False False False]]
bool
3.4 numpy中的裁剪clip()
函数原型:
numpy.clip(a, a_min, a_max, out=None)
函数调用方法: 此函数的调用方法有多种
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a1 = a.clip(3, 9)
print("a.clip(3, 9)的结果为:\n",a1)
a2 = np.clip(a,3,9)
print("np.clip(a,3,9)的结果为:\n",a2)
np.clip(a,3,9,out=a)
print("np.clip(a,3,9,out=a)的结果:\n", a)
执行结果:
3行6列的矩阵为:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
a.clip(3, 9)的结果为:
[[3 3 3 4 5 6]
[7 8 9 9 9 9]
[9 9 9 9 9 9]]
np.clip(a,3,9)的结果为:
[[3 3 3 4 5 6]
[7 8 9 9 9 9]
[9 9 9 9 9 9]]
np.clip(a,3,9,out=a)的结果:
[[3 3 3 4 5 6]
[7 8 9 9 9 9]
[9 9 9 9 9 9]]
4. numpy中的nan和inf
4.1 概念
(1)nan(NAN or Nan):not a number,表示不是一个数字。 numpy中出现nan的情况: (1.1)读取本地文件为float的时候,如果有缺失,就会出现nan。 (1.2)做了一个不合适的计算的时候,比如无穷大减去无穷大。
(2)inf (-inf or inf):infinity,inf表示正无穷,-inf表示负无穷。 numpy中出现inf的情况: (2.1)比如一个数字除以0。
4.2 指定nan或者inf
import numpy as np
b = np.nan
print(b)
print(type(b))
c = np.inf
print(c)
print(type(c))
4.3 numpy中nan的注意点
(1)两个nan是不相等的。
print(np.nan != np.nan)
执行结果:
True
(2)利用(1)的特性可以判断数组/矩阵中nan的个数。
import numpy as np
a = np.array(range(1, 19), dtype=float).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a[0:2,0:2]=np.nan
print("赋值nan后的结果:\n",a)
print("a中nan的个数为:\n",np.count_nonzero(a!=a))
执行结果:
3行6列的矩阵为:
[[ 1. 2. 3. 4. 5. 6.]
[ 7. 8. 9. 10. 11. 12.]
[13. 14. 15. 16. 17. 18.]]
赋值nan后的结果:
[[nan nan 3. 4. 5. 6.]
[nan nan 9. 10. 11. 12.]
[13. 14. 15. 16. 17. 18.]]
a中nan的个数为: 4
(3)使用 np.isnan(a) 判断某个数字是否为nan。
import numpy as np
a = np.array(range(1, 19), dtype=float).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
a[a < 4] = np.nan
print("元素赋值为nan后的结果:\n",a)
a[np.isnan(a)] = 1
print("判断a中元素的值是否为nan,并将值为nan的元素赋值为1:\n",a)
b = np.nan
print(np.isnan(b))
执行结果:
3行6列的矩阵为:
[[ 1. 2. 3. 4. 5. 6.]
[ 7. 8. 9. 10. 11. 12.]
[13. 14. 15. 16. 17. 18.]]
元素赋值为nan后的结果:
[[nan nan nan 4. 5. 6.]
[ 7. 8. 9. 10. 11. 12.]
[13. 14. 15. 16. 17. 18.]]
判断a中元素的值是否为nan,并将值为nan的元素赋值为1:
[[ 1. 1. 1. 4. 5. 6.]
[ 7. 8. 9. 10. 11. 12.]
[13. 14. 15. 16. 17. 18.]]
True
(4)nan和任何值计算都得nan。
5. numpy中常用的统计函数
(1)求和:t.sum(axis=None)
(2)均值:t.mean(a,axis=None)
(3)中值:np.median(t,axis=None)
(4)最大值:t.max(axis=None)
(5)最小值:t.min(axis=None)
(6)极值:np.ptp(t,axis=None),即最大值与最小值只差
(7)标准差:t.std(axis=None),不加axis的话默认返回所有元素的标准差,
加axis的话返回某一axis方向的标准差。
import numpy as np
a = np.array(range(1, 19), dtype=float).reshape(3, 6)
print("3行6列的矩阵为:\n", a)
print("求和:",a.sum(axis=0))
print("最大值:",a.max(axis=0))
print("最小值:",a.min(axis=0))
print("均值:",a.mean(axis=0))
print("中值:",np.median(a,axis=0))
print("极值:",np.ptp(a,axis=0))
print("标准差:",a.std(axis=0))
执行结果:
3行6列的矩阵为:
[[ 1. 2. 3. 4. 5. 6.]
[ 7. 8. 9. 10. 11. 12.]
[13. 14. 15. 16. 17. 18.]]
求和: [21. 24. 27. 30. 33. 36.]
最大值: [13. 14. 15. 16. 17. 18.]
最小值: [1. 2. 3. 4. 5. 6.]
均值: [ 7. 8. 9. 10. 11. 12.]
中值: [ 7. 8. 9. 10. 11. 12.]
极值: [12. 12. 12. 12. 12. 12.]
标准差: [4.89897949 4.89897949 4.89897949 4.89897949 4.89897949 4.89897949]
6.数组/矩阵的拼接、分割
6.1 数组/矩阵的拼接
6.1.1 竖直拼接
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("a:\n", a)
b = np.array(range(10, 190, 10), dtype=int).reshape(3, 6)
print("b:\n", b)
v_ab = np.vstack((a, b))
print("竖直拼接:\n", v_ab)
执行结果:
a:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
b:
[[ 10 20 30 40 50 60]
[ 70 80 90 100 110 120]
[130 140 150 160 170 180]]
竖直拼接:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[ 13 14 15 16 17 18]
[ 10 20 30 40 50 60]
[ 70 80 90 100 110 120]
[130 140 150 160 170 180]]
6.1.2 水平拼接
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("a:\n", a)
b = np.array(range(10, 190, 10), dtype=int).reshape(3, 6)
print("b:\n", b)
h_ab = np.hstack((a,b))
print("水平拼接:\n", h_ab)
执行结果:
a:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
b:
[[ 10 20 30 40 50 60]
[ 70 80 90 100 110 120]
[130 140 150 160 170 180]]
水平拼接:
[[ 1 2 3 4 5 6 10 20 30 40 50 60]
[ 7 8 9 10 11 12 70 80 90 100 110 120]
[ 13 14 15 16 17 18 130 140 150 160 170 180]]
6.2 数组/矩阵的分割
6.2.1 水平分割hsplit()
函数原型:
hsplit(ary, indices_or_sections)
import numpy as np
a = np.array(range(1, 19), dtype=int).reshape(3, 6)
print("a:\n", a)
b, c = np.hsplit(a, 2)
print("分割后的结果:")
print("b:\n", b)
print("c:\n", c)
d, e, f ,g= np.hsplit(a, [2, 3, 4])
print("分割后的结果:")
print("d:\n", d)
print("e:\n", e)
print("f:\n", f)
print("g:\n", g)
执行结果:
a:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
分割后的结果:
b:
[[ 1 2 3]
[ 7 8 9]
[13 14 15]]
c:
[[ 4 5 6]
[10 11 12]
[16 17 18]]
分割后的结果:
d:
[[ 1 2]
[ 7 8]
[13 14]]
e:
[[ 3]
[ 9]
[15]]
f:
[[ 4]
[10]
[16]]
g:
[[ 5 6]
[11 12]
[17 18]]
6.2.2 垂直分割vsplit()
函数原型:
vsplit(ary, indices_or_sections)
import numpy as np
a = np.array(range(1, 25), dtype=int).reshape(4, 6)
print("a:\n", a)
b, c = np.vsplit(a, 2)
print("分割后的结果:")
print("b:\n", b)
print("c:\n", c)
d, e, f, g = np.vsplit(a, [1, 2, 3])
print("分割后的结果:")
print("d:\n", d)
print("e:\n", e)
print("f:\n", f)
print("g:\n", g)
执行结果:
a:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]]
分割后的结果:
b:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
c:
[[13 14 15 16 17 18]
[19 20 21 22 23 24]]
分割后的结果:
d:
[[1 2 3 4 5 6]]
e:
[[ 7 8 9 10 11 12]]
f:
[[13 14 15 16 17 18]]
g:
[[19 20 21 22 23 24]]
6.2.3 指定轴分割split()
函数原型:
split(ary, indices_or_sections, axis=0)
import numpy as np
a = np.array(range(1, 25), dtype=int).reshape(4, 6)
print("a:\n", a)
b, c = np.split(a, 2, axis=0)
print("分割后的结果:")
print("b:\n", b)
print("c:\n", c)
d, e, f, g = np.split(a, [1, 2, 3], axis=1)
print("分割后的结果:")
print("d:\n", d)
print("e:\n", e)
print("f:\n", f)
print("g:\n", g)
执行结果:
a:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]]
分割后的结果:
b:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
c:
[[13 14 15 16 17 18]
[19 20 21 22 23 24]]
分割后的结果:
d:
[[ 1]
[ 7]
[13]
[19]]
e:
[[ 2]
[ 8]
[14]
[20]]
f:
[[ 3]
[ 9]
[15]
[21]]
g:
[[ 4 5 6]
[10 11 12]
[16 17 18]
[22 23 24]]
6.2.4 深度分割dsplit()
深度分割的作用是将三维数组/矩阵沿着axis=2方向分割成若干个子数组/矩阵。
import numpy as np
a = np.array(range(1, 25), dtype=int).reshape(2, 3, 4)
print("a:\n", a)
b, c, d, e = np.dsplit(a, [1, 2, 3])
print("分割后的结果:")
print("b:\n", b)
print("c:\n", c)
print("d:\n", d)
print("e:\n", e)
执行结果:
a:
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[13 14 15 16]
[17 18 19 20]
[21 22 23 24]]]
分割后的结果:
b:
[[[ 1]
[ 5]
[ 9]]
[[13]
[17]
[21]]]
c:
[[[ 2]
[ 6]
[10]]
[[14]
[18]
[22]]]
d:
[[[ 3]
[ 7]
[11]]
[[15]
[19]
[23]]]
e:
[[[ 4]
[ 8]
[12]]
[[16]
[20]
[24]]]
7. 数组/矩阵行列交换
import numpy as np
a = np.array(range(1, 25), dtype=int).reshape(4, 6)
print("a:\n", a)
a[[1, 2], :] = a[[2, 1], :]
print("交换后的结果:")
print("a:\n", a)
执行结果:
a:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]]
交换后的结果:
a:
[[ 1 2 3 4 5 6]
[13 14 15 16 17 18]
[ 7 8 9 10 11 12]
[19 20 21 22 23 24]]
8. numpy其它实用方法
(1)获取最大、最小值的下标索引: (1.1)np.argmax(t, axis=0) (1.2)np.argmin(t, axis=0) (2)创建元素均为0的数组/矩阵np.zeros((3,4),dtype=int) (3)创建元素均为1的数组/矩阵np.ones((3,4),dtype=int) (4)创建对角线元素为1的单位矩阵np.eye(3)
import numpy as np
a = np.array(range(1, 25), dtype=int).reshape(4, 6)
print("a:\n", a)
print("求axis=0方向的最大值的下标索引\n", np.argmax(a, axis=0))
print("求axis=1方向的最小值的下标索引:\n", np.argmin(a, axis=1))
print("创建全0数组/矩阵\n", np.zeros((3, 4), dtype=int))
print("创建全1数组/矩阵:\n", np.ones((3, 4), dtype=int))
print("创建单位矩阵:\n", np.eye(3, dtype=int))
执行结果:
a:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]]
求axis=0方向的最大值的下标索引
[3 3 3 3 3 3]
求axis=1方向的最小值的下标索引:
[0 0 0 0]
创建全0数组/矩阵
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
创建全1数组/矩阵:
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
创建单位矩阵:
[[1 0 0]
[0 1 0]
[0 0 1]]
9. numpy 生成随机数
参数 | 解释 |
---|
np.random.rand(维度) | 创建xxx维度的均匀分布的随机数组,浮点数,范围0~1 | np.random.randn(维度) | 创建xxx维度的标准正态分布随机数组,浮点数,平均数0,标准差1 | np.random.randint(low,high,(shape)) | 从给定的上下限的范围内随机选取整数,low下限,high上限,(shape)形状/维度 | np.random.uniform(low,high,(size)) | 产生具有均匀分布的数组,low起始值,high结束值,(size)形状/维度 | np.random.normal(loc,scale,(size)) | 从指定正态分布中随机抽取样本,分布中心loc,标准差scale,(size)形状/维度 | np.random.seed(种子值) | 随机数种子。因为计算机生成的是伪随机数,所以通过设定相同的随机数种子,可以每次生成相同的随机数。 |
import numpy as np
np.random.seed(10)
print("均匀分布随机数组:\n",np.random.rand(3,4))
print("给定上下限的整数随机数组:\n",np.random.randint(1,10,(3,3)))
print("标准正态随机数组:\n",np.random.randn(3,3))
print("均匀分布随机数组:\n",np.random.uniform(1,10,(3,3)))
print("正态分布中随机抽取样本,设置分布中心、标准差、形状:\n",np.random.normal(0,1,(3,4)))
执行结果:
均匀分布随机数组:
[[0.77132064 0.02075195 0.63364823 0.74880388]
[0.49850701 0.22479665 0.19806286 0.76053071]
[0.16911084 0.08833981 0.68535982 0.95339335]]
给定上下限的整数随机数组:
[[7 9 2]
[9 5 2]
[4 7 6]]
标准正态随机数组:
[[-1.13660221 0.13513688 1.484537 ]
[-1.07980489 -1.97772828 -1.7433723 ]
[ 0.26607016 2.38496733 1.12369125]]
均匀分布随机数组:
[[8.24700877 5.69482437 9.17783993]
[3.8731248 1.81413414 3.70630051]
[2.02585926 8.45813194 1.42206687]]
正态分布中随机抽取样本,设置分布中心、标准差、形状:
[[ 1.67262221 0.80705192 2.14180538 -0.49561818]
[ 0.52563742 -0.38964647 0.9372965 -0.8169742 ]
[ 1.01961544 -0.34143633 0.7512814 -0.36225179]]
|