Numpy必掌握的76道精选题型!!
本人学东西有点抠牛角尖,所以注释会详细点。希望大家可以从中学到些东西。
1.创建数组的基本方法
#以一维数组为例
import numpy as np #首先导入numpy包
a = np.array([0, 1, 2, 3, 4]) #通过列表创建,注意是中括号
b = np.array((0, 1, 2, 3, 4)) #通过元组创建,注意是小括号
c = np.arange(0,5,1) #0是开始数字,5是结束数字(不含本身),1是间隔;也可以直接省略写成np.arange(5)
d = np.linspace(0, 5, 5,endpoint=False) #linspace 用于在指定的区间内返回间隔均匀的值。0是开始数字,中间5是结束数字,后面的5是元素个数,endpoint=False代表结束数字不含5本身
a,b,c,d
(array([0, 1, 2, 3, 4]),
array([0, 1, 2, 3, 4]),
array([0, 1, 2, 3, 4]),
array([0., 1., 2., 3., 4.]))
2.通过列表创建一维数组,数组包含1、2、3、4、5这5个数字即可。
a = np.array([1, 2, 3, 4, 5]) #[1, 2, 3, 4, 5]是列表,注意列表是中括号;array为返回数组的函数
a
array([1, 2, 3, 4, 5])
3.输出该一维数组的形状特征
a.shape
(5,)
4.输出该一维数组中的元素2与元素3
a[1],a[2] #列表[1, 2, 3, 4, 5]从左到右的索引依次是0,、1、2、3、4,故而a[1]输出2,a[2]输出3
(2, 3)
5.将该一维数组中的元素1修改成-1
a[0] = -1
a
array([-1, 2, 3, 4, 5])
6.通过列表创建二维数组
a=np.array([[1, 2, 3], [4, 5, 6]]) #可留意到与题1不同之处,该二维数组中外围有两层中括号
a
array([[1, 2, 3],
[4, 5, 6]])
7.输出该二维数组的形状特征
a.shape #代表该二维数组是2行3列
(2, 3)
8.分别输出该二维数组中的第1行与第2行
a[0],a[1] #留意与题3不同,a[0]表示第1行的索引0,取[1, 2, 3];a[1]表示第2行的索引1,取[4, 5, 6];
(array([1, 2, 3]), array([4, 5, 6]))
9.获取该二维数组中元素6
a[1, 2] #6在第2行第3列,而第2行的索引是1,第3列的索引是2,所以a[1, 2]
6
10.将该二维数组中的元素6修改成-1
a[1, 2]=-1
a
array([[ 1, 2, 3],
[ 4, 5, -1]])
11.通过列表创建三维数组
a=np.array([[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9],[10, 11, 12]]]) #可留意到与题1题5不同之处,该三维数组中外围有三层中括号
a
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
12.输出该三维数组的形状特征
a.shape #可以想象成立方体的长宽高,第一个2代表深度,第二个2代表2行,第三个3代表3列
(2, 2, 3)
13.输出该三维数组中的[[1, 2, 3], [4, 5, 6]]
a[0] #索引0对应的是[[1, 2, 3], [4, 5, 6]]
array([[1, 2, 3],
[4, 5, 6]])
14.输出该三维数组中的[4, 5, 6]
a[0,1] #索引0对应的是[[1, 2, 3], [4, 5, 6]],而索引1又对应其中的[4, 5, 6]
array([4, 5, 6])
15.输出该三维数组中的元素9
a[1,0,2] #9位于[[ 7, 8, 9],[10, 11, 12]]中,而[[ 7, 8, 9],[10, 11, 12]]对应索引1,在[[ 7, 8, 9],[10, 11, 12]]中,9又是
#位于第1行(索引0,第3列(索引2)),所以取索引1、0、2
9
16.将该三维数组中的元素9修改成-1
a[1,0,2] =-1
a
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, -1],
[10, 11, 12]]])
17.创建一维数组,所有元素为0
a = np.zeros((5)) #zeros填充0的函数。可以换成np.ones试试,全填充1
a
array([0., 0., 0., 0., 0.])
18.创建二维数组,所有元素为0
a = np.zeros((2,3)) #可以换成np.ones试试,全填充1
a
array([[0., 0., 0.],
[0., 0., 0.]])
19.创建二维数组,所有元素为6
np.full((2,3), 6) #也可将6换成True看看效果
array([[6, 6, 6],
[6, 6, 6]])
20.创建二维数组,对角线填充1
np.eye(5, 4, 0) #5、4代表5行4列,0代表填充的1是从第0个索引开始的,右下角45度的方向填充1
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 0., 0., 0.]])
21.取出一维数组中的某些元素
# 先创建一维数组a
a = np.arange(0, 100, 10)
a
array([ 0, 10, 20, ..., 70, 80, 90])
a[[1, 5, -1]] #索引1对应10,索引5对应50,索引-1对应90
array([10, 50, 90])
a[1],a[5],a[-1] #或者采取此方法
(10, 50, 90)
22.取出一维数组的前5个元素
a[:5]
array([ 0, 10, 20, 30, 40])
23.取出一维数组中大于某个值的元素
a[a >= 60]
array([60, 70, 80, 90])
24.取出一维数组中小于某个值的元素
a[np.where(a<= 60)] #np.where(a<= 60)取出的是索引,不是元素,所以需要再在外侧加上a[]
array([ 0, 10, 20, ..., 40, 50, 60])
25.取出二维数组中的某些元素
# 先创建一个二维数组
a = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28 ,29, 30],
[31, 32, 33, 34, 35]])
a[0, 1:4] #0代表第1行(索引从0开始的),1:4代表第一行的12(索引1)、13(索引2)、14(索引3)
array([12, 13, 14])
a[1:4, 0] #1:4代表中间的三行,0代表第一列,交叉就是[16, 21, 26]
array([16, 21, 26])
26.取出二维数组中的某些元素
a[::2,::2] #左侧::2代表所有行,但步长为2行的部分,即第1、3、5行;右侧::2代表所有列,但步长为2列的部分,即第1、3、5列
array([[11, 13, 15],
[21, 23, 25],
[31, 33, 35]])
a[:, 1] #:代表所有行,1代表第2列(切记索引是从0开始的)
array([12, 17, 22, 27, 32])
27.判断数组中元素是否大于20
a > 20
array([[False, False, False, False, False],
[False, False, False, False, False],
[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True]])
28.将数组中大于20的元素取出来
a[a > 20]
array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35])
29.新创建数组b来获取a中的元素
a = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28 ,29, 30],
[31, 32, 33, 34, 35]])
b=np.array([0, 2, 0, 1])
a[np.arange(4), b] #np.arange(4)是[0, 1, 2, 3],那么a[np.arange(4), b]就是a[[0, 1, 2, 3], [0, 2, 0, 1]];行索引0列索引0是11,行索引1列索引2是18,以此类推
array([11, 18, 21, 27])
30.将以上结果加上10并且返回到原数组中
a[np.arange(4), b] += 10
a
array([[21, 12, 13, 14, 15],
[16, 17, 28, 19, 20],
[31, 22, 23, 24, 25],
[26, 37, 28, 29, 30],
[31, 32, 33, 34, 35]])
31.找出a中数字1的第5次重复的索引
a = np.array([1, 2, 1, 1, 3, 4, 3, 1, 1, 2, 1, 1, 2])
n = 5
a
array([1, 2, 1, ..., 1, 1, 2])
方法一
[i for i, v in enumerate(a) if v == 1][n-1] #enumerate 函数用于遍历序列中的元素以及它们的下标;遍历a至第5个1停止(n-1是4,但是索引从0开始,所以其实是5个数)
8
方法二
np.where(a == 1)[0][n-1] #np.where(a == 1)得到的是a为1的索引,然后看到n-1索引的位置下是8
8
32.改变一维数组的形状
方法一
a=np.arange(10)
a.reshape(2, -1) #不用纠结-1的具体意义,换成-2、-3、-9等,结果不会变化。可理解为该一维数组等分成2行即可。
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
方法二
a=np.arange(10)
a.reshape(2, 5) #2行5列
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
方法三
a=np.arange(10)
a.resize(2, 5) #reshape 在改变形状时,不会影响原数组,相当于对原数组做了一份拷贝。而 resize 改变了原数组a。
a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
33.生成随机数
方法一
np.random.uniform(5,10, size=(5,3)) ##uniform随机生成一个实数
array([[6.47685196, 6.35428782, 8.37975113],
[7.63991692, 8.77225946, 6.17618534],
[9.16021832, 5.76089746, 8.6702215 ],
[9.4977338 , 9.73516438, 5.69482014],
[7.37553017, 5.3912064 , 7.62662221]])
方法二
np.random.randint(10, size=(5, 5)) #生成二维数组
array([[4, 1, 5, 3, 4],
[4, 3, 7, 1, 1],
[7, 7, 0, 2, 9],
[9, 3, 2, 5, 8],
[1, 0, 7, 6, 2]])
np.random.randint(2, 5, 10) #生成一维数组
array([2, 3, 4, ..., 4, 4, 3])
方法三
np.random.rand(2, 5) #创建二维随机数组; rand返回了一个大于等于 0 且小于 1 的平均分布的随机实数。
array([[0.2 , 0.28, 0.25, 0.17, 0.97],
[0.96, 0.6 , 0.73, 0.34, 0.09]])
方法四
np.random.randn(1, 10) #从标准正态分布中返回一个或多个样本值。
array([[ 1.38, -1.19, 0.08, ..., 0.35, -0.7 , 0.11]])
34.两数组相加
a = np.arange(25).reshape((5, 5))
b = np.random.randint(0, 10, (5, 5))
a+b #或者np.add(a, b)
array([[ 5, 4, 7, 5, 10],
[ 6, 7, 12, 17, 11],
[15, 17, 16, 19, 21],
[24, 23, 20, 18, 21],
[25, 22, 23, 23, 27]])
35.两数组相减
a-b #或者np.subtract(a,b)
array([[-5, -2, -3, 1, -2],
[ 4, 5, 2, -1, 7],
[ 5, 5, 8, 7, 7],
[ 6, 9, 14, 18, 17],
[15, 20, 21, 23, 21]])
36.两数组相乘
a*b #或者np.multiply(a,b)
array([[ 0, 3, 10, 6, 24],
[ 5, 6, 35, 72, 18],
[ 50, 66, 48, 78, 98],
[135, 112, 51, 0, 38],
[100, 21, 22, 0, 72]])
37.两数组相除
a/b #或者np.divide(a, b)
array([[ 0. , 0.33, 0.4 , 1.5 , 0.67],
[ 5. , 6. , 1.4 , 0.89, 4.5 ],
[ 2. , 1.83, 3. , 2.17, 2. ],
[ 1.67, 2.29, 5.67, inf, 9.5 ],
[ 4. , 21. , 22. , inf, 8. ]])
38.两数组比较大小
a<b
array([[False, True, True, False, True],
[ True, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False]])
39.数组中各个元素取平方
a = np.arange(25).reshape((5, 5))
a**2
array([[ 0, 1, 4, 9, 16],
[ 25, 36, 49, 64, 81],
[100, 121, 144, 169, 196],
[225, 256, 289, 324, 361],
[400, 441, 484, 529, 576]], dtype=int32)
40.数组中所有元素求总和
a.sum()
300
41.数组中各列元素求总和
np.sum(a, axis=0)
array([50, 55, 60, 65, 70])
42.数组中各行元素求总和
np.sum(a, axis=1)
array([ 10, 35, 60, 85, 110])
43.数组中最小/最大元素
a.min() #最大值就是a.max()
0
44.数组中元素累加值
a.cumsum() #所得到的结果是该结果之前元素之和,如6是0+1+2+3
array([ 0, 1, 3, ..., 253, 276, 300], dtype=int32)
45.将数组中所有的奇数换成-1,偶数换成1,原数组改变
a[a % 2 == 1] = -1
a[a % 2 == 0] = 1
a #a不再是原来的a了
array([[-1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1]])
46.将数组中所有的奇数换成-1,偶数换成1,原数组不改变
np.where(a % 2 == 1, -1, 1)
array([[ 1, -1, 1, -1, 1],
[-1, 1, -1, 1, -1],
[ 1, -1, 1, -1, 1],
[-1, 1, -1, 1, -1],
[ 1, -1, 1, -1, 1]])
a #a还是原来的a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
47.保留3位小数
a = np.random.random([5,3])
np.set_printoptions(precision=3)
a
varray([[0.664, 0.524, 0.173],
[0.943, 0.242, 0.999],
[0.583, 0.183, 0.387],
[0.19 , 0.411, 0.595],
[0.717, 0.487, 0.31 ]])
48.计算两个数组间的欧式距离
a = np.array([1,2,3,4,5])
b = np.array([4,5,6,7,8])
np.linalg.norm(a-b) #欧式距离函数。即根号下[(4-1)的平方+(5-2)的平方+(6-3)的平方+(7-4)的平方+(8-5)的平方]
6.708203932499369
49.向矩阵的每一行添加常数向量
a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
a
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
b = np.array([1, 0, 1])
b
array([1, 0, 1])
方法一
c = np.empty_like(a)
c #形状类似于数组x,但是全部填充为0
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
for i in range(4): #range(4)是0、1、2、3,因为数组a一共就4行,行索引是0、1、2、3
c[i, :] = a[i, :] + b #i从0-3依次循环。比如i=3时,a[i, :]代表a的第3行、所有列,即[10, 11, 12],再加上b,得到[11 11 13],放于c[i, :],即c的第3行所有列
print(c) #完成了向a的每一行都加上了[1, 0, 1]
[[ 2 2 4]
[ 5 5 7]
[ 8 8 10]
[11 11 13]]
方法二
d = np.tile(b, (4, 1)) #tile的意思是将b横向复制4次,纵向复制1次即可,可改成(4,2)看下不同之处
d
array([[1, 0, 1],
[1, 0, 1],
[1, 0, 1],
[1, 0, 1]])
c = a + d
print(c)
[[ 2 2 4]
[ 5 5 7]
[ 8 8 10]
[11 11 13]]
方法三
c = a + b
print(c)
[[ 2 2 4]
[ 5 5 7]
[ 8 8 10]
[11 11 13]]
50.二维数组乘以一维数组
a = np.array([1,2,3]) #可单独运行一下
b = np.array([4,5])
np.reshape(a, (3, 1)) * b #注意不同于上题中的np.tile(b, (4, 1)),这个是重塑形状,tile是复制形状;可单独运行一下reshape(a, (3, 1))看看结果。
array([[ 4, 5],
[ 8, 10],
[12, 15]])
51.二维数组加上一维数组
a = np.array([1,2,3])
c = np.array([[1,2,3], [4,5,6]])
c + a
array([[2, 4, 6],
[5, 7, 9]])
52.不同数组长度的运算
方法一
b = np.array([4,5])
c = np.array([[1,2,3], [4,5,6]])
(c.T + b).T #先转置再运算
array([[ 5, 6, 7],
[ 9, 10, 11]])
方法二
c + np.reshape(b, (2, 1))
array([[ 5, 6, 7],
[ 9, 10, 11]])
53.绘制简单二次函数图
import numpy as np
import matplotlib.pyplot as plt #引入绘图库
x = np.arange(0,10,2) #x生成了[0, 2, 4, 6, 8]
y = x**2 #y是x的平方
plt.plot(x, y) #意思是以x 为横坐标值,y为纵坐标值绘制曲线
plt.show() #展示出所画图形
在这里插入图片描述
54.纵向叠加两个数组
a = np.arange(10).reshape(2,-1)
b = np.repeat(1, 10).reshape(2,-1)
print(a)
print(b)
[[0 1 2 3 4]
[5 6 7 8 9]]
[[1 1 1 1 1]
[1 1 1 1 1]]
方法一
np.concatenate([a, b], axis=0) #沿着列叠加
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
方法二
np.vstack([a, b])
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
方法三
np.r_[a, b]
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
55.横向叠加两个数组
a = np.arange(10).reshape(2,-1)
b = np.repeat(1, 10).reshape(2,-1)
print(a)
print(b)
[[0 1 2 3 4]
[5 6 7 8 9]]
[[1 1 1 1 1]
[1 1 1 1 1]]
方法一
np.concatenate([a, b], axis=1)
array([[0, 1, 2, ..., 1, 1, 1],
[5, 6, 7, ..., 1, 1, 1]])
方法二
np.hstack([a, b])
array([[0, 1, 2, ..., 1, 1, 1],
[5, 6, 7, ..., 1, 1, 1]])
方法三
np.c_[a, b]
array([[0, 1, 2, ..., 1, 1, 1],
[5, 6, 7, ..., 1, 1, 1]])
56.将数组[1,2,3]变成[1, 1, 1, 2, 2, 2, 3, 3, 3]
a = np.array([1,2,3])
np.repeat(a, 3)
array([1, 1, 1, ..., 3, 3, 3])
57.将数组[1,2,3]变成[1, 2, 3, 1, 2, 3, 1, 2, 3]
a = np.array([1,2,3])
np.tile(a, 3)
array([1, 2, 3, ..., 1, 2, 3])
58.取数组a、b中的相同的元素
a = np.array([1,2,3,2,3,4])
b = np.array([7,2,9,4,9,8])
np.intersect1d(a,b)
array([2, 4])
59.从数组a中删除与数组b相同的元素
a = np.array([1,2,3,4,5])
b = np.array([5,6,7,8,9])
np.setdiff1d(a,b) #np.setdiff1d(b,a)正好相反,是从数组b中删除与数组a相同的元素
array([1, 2, 3, 4])
60.从一维数组中删除所有NaN值
a = np.array([1,2,3,np.nan,5,6,7,np.nan])
a[~np.isnan(a)] #~是“非”的意思,即不是nan
array([1., 2., 3., 5., 6., 7.])
61.获取a和b元素对应的位置
a = np.array([1,2,3,2,3,4,3,4,5,6])
b = np.array([7,2,10,2,7,4,9,4,9,8])
np.where(a == b) #a、b在索引1, 3, 5, 7中的元素是一模一样的
(array([1, 3, 5, 7], dtype=int64),)
62.获取数组a中给定范围的所有元素
方法一
a = np.arange(15)
b= np.where((a >= 5) & (a <= 10))
a[b]
array([ 5, 6, 7, 8, 9, 10])
方法二
a = np.arange(15)
b = np.where(np.logical_and(a>=5, a<=10)) #np.logical_and/or/not (逻辑与/或/非)
a[b]
array([ 5, 6, 7, 8, 9, 10])
方法三
a = np.arange(15)
a[(a >= 5) & (a <= 10)]
array([ 5, 6, 7, 8, 9, 10])
63.交换二维numpy数组中的两列
arr = np.arange(9).reshape(3,3)
arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
arr[:, [1,0,2]] #左侧:代表所有行,右侧代表列索引
array([[1, 0, 2],
[4, 3, 5],
[7, 6, 8]])
64.交换二维numpy数组中的两行
arr = np.arange(9).reshape(3,3)
arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
arr[[1,0,2],:]
array([[3, 4, 5],
[0, 1, 2],
[6, 7, 8]])
65.行倒数
arr = np.arange(9).reshape(3,3)
arr[::-1]
array([[6, 7, 8],
[3, 4, 5],
[0, 1, 2]])
66.列倒数
arr = np.arange(9).reshape(3,3)
arr[:,::-1]
array([[2, 1, 0],
[5, 4, 3],
[8, 7, 6]])
67.限制打印的元素数目
np.set_printoptions(threshold=6) #threshold表示限制出现6个元素
a = np.arange(15)
a
array([ 0, 1, 2, ..., 12, 13, 14])
68.创建以5起始,累加3,长度为10的一维数组
length = 10
start = 5
step = 3
def seq(start, length, step):
end = start + (step*length) #end=5+3*10=35
return np.arange(start, end, step) #np.arange(5, 35, 3)
seq(start, length, step)
array([ 5, 8, 11, ..., 26, 29, 32])
69.计算numpy数组的移动平均值
np.random.seed(100) #seed是随机数种子,利用随机数种子,每次生成的随机数相同。比如保持100,每次运行生成的随机数不会变。
Z = np.random.randint(10, size=6)
print('array: ', Z)
array: [8 8 3 7 7 0]
方法一
def moving_average(a, n=3) :
ret = np.cumsum(a)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1:] / n
moving_average(Z, n=3).round(3)
array([6.333, 6. , 5.667, 4.667])
方法二
np.convolve(Z, np.ones(3)/3, mode='valid')
#convolve是numpy函数中的卷积函数库。
# Z是输入的一维数组
# np.ones(3)/3是输入的第二个一维数组
#当mode='valid'时返回的数组长度为这两个一维数组的最长长度-最短长度+1,即6-3+1=4,代表了最终结果长度是4
array([6.333, 6. , 5.667, 4.667])
70.将时间转换成数字表示
from datetime import datetime
dt64 = np.datetime64('2018-02-25 22:10:10')
dt64
numpy.datetime64('2018-02-25T22:10:10')
方法一
dt64.tolist() #转换列表函数
datetime.datetime(2018, 2, 25, 22, 10, 10)
方法二
dt64.astype(datetime)
datetime.datetime(2018, 2, 25, 22, 10, 10)
71.找到一个一维数组a中的所有峰值
#第1步:先求出后一项减去前一项的差值
a = np.array([1, 3, 7, 1, 2, 6, 0, 1])
b=np.diff(a)
b
array([ 2, 4, -6, ..., 4, -6, 1])
#第2步:利用符号函数,将正数记作1,负数记作-1
c=np.sign(b)
c
array([ 1, 1, -1, ..., 1, -1, 1])
#第3步:再求出后一项减去前一项的差值
d=np.diff(c)
d
array([ 0, -2, 2, 0, -2, 2])
#第4步:获取d中元素为-2的索引。原因是如果7是峰值,(后一项-7)-(7-前一项)的值必定是负数:-2(提前已经利用符号函数sign变成1与-1了)
e=np.where(d == -2)
print(e)
(array([1, 4], dtype=int64),)
#第5步:将-2获取的索引加上1即可
e[0]+1
array([2, 5], dtype=int64)
72.获取数组每行的最小值
np.random.seed(100) #使得即使多次运行代码,随机数不会变,除非更改seed()内的数字
a = np.random.randint(1,10, [5,3])
a
array([[9, 9, 4],
[8, 8, 1],
[5, 3, 6],
[3, 3, 3],
[2, 1, 9]])
np.apply_along_axis(lambda x:min(x), arr=a, axis=1)#将arr数组的每一个元素经过lambda x:min(x)函数变换形成的一个新数组
array([4, 1, 3, 3, 1])
73.对一维数组a中的所有元素设置从小到大排序的排序号
np.random.seed(10)
a = np.random.randint(20, size=6)
a
array([ 9, 4, 15, 0, 17, 16])
a.argsort().argsort() #代表了每个元素从小到大位于第几位
array([2, 1, 3, 0, 5, 4], dtype=int64)
74.对二维数组a中的所有元素设置从小到大排序的排序号
np.random.seed(10)
a = np.random.randint(20, size=[2,3])
a
array([[ 9, 4, 15],
[ 0, 17, 16]])
#第1步:先将二维数组转变成一维数组
a.ravel()
array([ 9, 4, 15, 0, 17, 16])
#第2步:将元素从小到大排列的索引号取出来,比如最小元素的索引号是3,正好对应第一步结果的0
a.ravel().argsort()
array([3, 1, 0, 2, 5, 4], dtype=int64)
#第3步:继续将第2步的结果中的元素从小到大排列的索引号取出来,代表了每个元素从小到大位于第几位
a.ravel().argsort().argsort()
array([2, 1, 3, 0, 5, 4], dtype=int64)
#第4步:返回二维数组
a.ravel().argsort().argsort().reshape(a.shape)#也可以直接print(a.ravel().argsort().argsort().reshape(a.shape))一步达成。
array([[2, 1, 3],
[0, 5, 4]], dtype=int64)
75.将多个一维数组连接一起
a = np.arange(3)
b = np.arange(3,7)
c = np.arange(7,10)
m = np.array([arr1, arr2, arr3])
m
array([array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])],
dtype=object)
方法一
n = np.array([i for mm in m for i in mm])
n
array([0, 1, 2, ..., 7, 8, 9])
方法二
n = np.concatenate(m)
n
array([0, 1, 2, ..., 7, 8, 9])
76.将小于最小值的元素变成最小值,大于最大值的元素变成最大值
np.set_printoptions(precision=2)#设置小数位为2
np.random.seed(100)
a = np.random.uniform(1,50, 6)
a
array([27.63, 14.64, 21.8 , 42.39, 1.23, 6.96])
方法一
np.clip(a, a_min=10, a_max=30) #clip将元素限制在a_min, a_max之间,大于a_max的就使它等于 a_max,小于a_min的就使它等于a_min。
array([27.63, 14.64, 21.8 , 30. , 10. , 10. ])
方法二
np.where(a < 10, 10, np.where(a > 30, 30, a))
array([27.63, 14.64, 21.8 , 30. , 10. , 10. ])
以上题型是本人在学习Numpy中文网的过程中认认真真整理下来的。
感谢Numpy中文网!
https://www.numpy.org.cn/
大家在学习过程中如果发现不正确的地方,欢迎指正!共同进步!