1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > python-numpy--矩阵与数组的操作

python-numpy--矩阵与数组的操作

时间:2024-05-19 04:22:07

相关推荐

python-numpy--矩阵与数组的操作

一、numpy矩阵

安装numpy:pip install numpy

numpy简介

numpy是计算模块,主要有两种类型:数组、矩阵

特点:运算快

1、创建矩阵

mat1 = np.mat("1 2 3;2 3 4;1 2 3")mat2 = np.mat("1 7; 2 2; 8 2")mat3 = np.mat("1 2 3;2 3 4;1 2 3")mat4 = np.mat("1 0 0;0 4 0;0 0 6")print(mat1)[[1 2 3][2 3 4][1 2 3]]print(type(mat1))<class 'numpy.matrix'>

2、矩阵计算

# 加法运算print("矩阵加法运算:\n",mat1+mat3)矩阵加法运算:[[2 4 6][4 6 8][2 4 6]]# 乘法运算print("矩阵乘法运算:\n",mat1*mat2)矩阵乘法运算:[[29 17][40 28][29 17]]# 矩阵的转置运算 Tprint("矩阵转置:\n",mat1.T)矩阵转置:[[1 2 1][2 3 2][3 4 3]]# 逆矩阵方法 Iprint("逆矩阵:\n",mat4.I)逆矩阵:[[1. 0. 0. ][0. 0.25 0. ][0. 0. 0.16666667]]# 矩阵与数相乘print("数乘:\n",4*mat4)数乘:[[ 4 0 0][ 0 16 0][ 0 0 24]]# 矩阵与矩阵的对应元素相乘print("对应元素相乘的运算:\n",np.multiply(mat1,mat3))对应元素相乘的运算:[[ 1 4 9][ 4 9 16][ 1 4 9]]

二、矩阵属性

矩阵的结构 ----> shape

print("矩阵的结构:\n",mat1.shape)矩阵的结构:(3, 3)

矩阵的元素个数 ----> size

print("矩阵的元素个数:\n",mat1.size)矩阵的元素个数:9

矩阵的元素类型 ----> dtype

print("矩阵元素类型:\n",mat1.dtype)矩阵元素类型:int32

矩阵的维度 ----> ndim

print("矩阵的维度:\n",mat1.ndim)矩阵的维度:2

三、数组的创建

数组的所有运算都是对应元素的运算

1、数组的创建

# 一维的数组arr1 = np.array([1,2,3,4])print(arr1)print(type(arr1)) # numpy下的数组类型[1 2 3 4]<class 'numpy.ndarray'># 二维的数组arr2 = np.array([[1,2,3],[0,1,2],[2,3,1]])print(arr2)[[1 2 3][0 1 2][2 3 1]]# 列向量类型的数组arr3 = np.array([[1],[2],[3],[4]])print(arr3)[[1][2][3][4]]

2、数组的属性

数组的结构 ----> shape

print("一维数组结构:\n",arr1.shape)print("二维数组结构:\n",arr2.shape)一维数组结构:(4,)二维数组结构:(3, 3)

数组的元素个数 ----> size

print("数组元素个数:\n",arr1.size)print("数组元素个数:\n",arr2.size)数组元素个数:4数组元素个数:9

数组的元素类型 ----> dtype

print("一维数组元素类型:\n",arr1.dtype)print("二维数组元素类型:\n",arr2.dtype)一维数组元素类型:int32二维数组元素类型:int32

数组的维度 ----> ndim

print("一维数组的维度:\n",arr1.ndim)print("二维数组的维度:\n",arr2.ndim)一维数组的维度:1二维数组的维度:2

3、数组的索引

# 一维数组索引:arr1[0]arr1[:3]arr1[::-1]array([4, 3, 2, 1])# 二维数组的索引print(arr2)# arr2[行切片,列切片]arr2[1,2]arr2[1,1:3]arr2[0:2,0:2][[1 2 3][0 1 2][2 3 1]]array([[1, 2],[0, 1]])

切片的一些例子

arr2[::2,::2]array([[1, 3],[2, 1]])arr2[1:3,1:3]array([[1, 2],[3, 1]])arr2[:2,::2]array([[1, 3],[0, 2]])

不同行不同列(没有规则)的切片

arr2[(0,1,2),(0,1,2)]array([1, 1, 1])arr2[(1,0,1),(0,1,2)]array([0, 2, 2])arr2[(0,1,2),(2,1,0)]array([3, 1, 2])

bool取值 ----> 注意:不要行列同时传入bool值,只在行的位置或列的位置传入

mask = np.array([1,0,1],dtype=np.bool)print(mask)[ True False True]arr2[mask, :2]array([[1, 2],[2, 3]])arr2[:2,mask]array([[1, 3],[0, 2]])arr2[mask,mask]array([1, 1])

练习:取出数组中大于3的数

arr5 = np.array([1,6,3,4,5])# 构建一个maskmask = np.array([0,1,0,1,1],dtype=np.bool)arr5[mask]array([6, 4, 5])

4、特殊函数创建数组

(1)arange

# arange ==> 类似以rangearr6 = np.arange(1,10,1)print(arr6)[1 2 3 4 5 6 7 8 9] # 是一个数组而不是列表

(2)等差数列:linspace

np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None,axis=0)

参数说明:

endpoint=True:表示等差数列,在start与stop之间插入n-2个值(n为数值的个数)

endpoint=False:表示等差数列,在start与stop之间插入n-1个值,表示平均分成n份(为线段的个数)

arr7 = np.linspace(1,5,5) # 从1开始到5结束共五个数,会自动取之间的平均数print(arr7)[1. 2. 3. 4. 5.]

(3)等比数列:logspace

arr8 = np.logspace(0,2,3,base=10.0)print(arr8)[ 1. 10. 100.]arr8_1 = np.logspace(1,10,10,base=2)# arr8_1 = np.logspace(np.log10(2),np.log10(1024),10)print(arr8_1)[ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]# arr8_2 = np.logspace(1/2,11/2,6,base=9.0)arr8_2 = np.logspace(1,11,6,base=3)print(arr8_2)[3.00000e+00 2.70000e+01 2.43000e+02 2.18700e+03 1.96830e+04 1.77147e+05]arr8_3 = np.logspace(np.log10(2),np.log10(162),5)print(arr8_3)[ 2. 6. 18. 54. 162.]

(4)全一数组:ones

arr9 = np.ones((3, 4))print(arr9)"""[[1. 1. 1. 1.][1. 1. 1. 1.][1. 1. 1. 1.]]"""

(5)全零数组:zeros

arr10 = np.zeros((3, 3))print(arr10)"""[[0. 0. 0.][0. 0. 0.][0. 0. 0.]]"""

(6)单位数组:eye

arr11 = np.eye(3)print(arr11)"""[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]"""

(7)对角数组:diag

arr12 = np.diag([1, 2, 3, 4])print(arr12)"""[[1 0 0 0][0 2 0 0][0 0 3 0][0 0 0 4]]"""

5、创建随机数组

(1)创建n个在0~1之间的随机数,为一维数组

arr13 = np.random.random(10)print(arr13)"""[0.16533666 0.93130472 0.99346775 0.86320579 0.40984664 0.826645750.83127987 0.81813288 0.38185262 0.5596341 ]"""

(2)创建服从均匀分布的随机数组

# 如在0~1之间分成100份,它的值是由概率生成的大致都接近的数arr14 = np.random.rand(100)print(arr14)

(3)创建正态分布数组随机数

arr15 = np.random.randn(10000)# 可以通过图形来感受正态分布的随机数import matplotlib.pyplot as pltplt.figure()plt.hist(arr15, 20)plt.show()

(4)随机整数的生成

# 参数:low(起始值) <= X < high(结束值)print(np.random.randint(2, 4, size=[2, 5]))"""[[3 3 2 3 3][3 2 2 2 3]]"""

6、形态变换、重置数组结构

(1)一维数组变为二维数组

arr_1 = np.arange(10)print(arr_1) # [0 1 2 3 4 5 6 7 8 9]arr_2 = arr_1.reshape((2, 5))print(arr_2)"""[[0 1 2 3 4][5 6 7 8 9]]"""

(2)展平:ravel ----> 二维数组变为一维数组

# 将刚才的二维数组转回一维数组print(arr_2.ravel()) # [0 1 2 3 4 5 6 7 8 9]

(3)展平方法二:flatten

参数:order='C':以行展平,表示横向展平order='F':以列展平,表示纵向展平print(arr_2.flatten('C')) # [0 1 2 3 4 5 6 7 8 9]print(arr_2.flatten('F')) # [0 5 1 6 2 7 3 8 4 9]

(4)堆叠方法

arr_3 = np.zeros((3, 4))arr_4 = np.ones((3, 4))横向堆叠,只有一个参数,是个元组,数组需要行数一致arr_5 = np.hstack((arr_3, arr_4))print(arr_5)"""[[0. 0. 0. 0. 1. 1. 1. 1.][0. 0. 0. 0. 1. 1. 1. 1.][0. 0. 0. 0. 1. 1. 1. 1.]]"""# 纵向堆叠,需要满足列数一致arr_6 = np.vstack((arr_3, arr_4))print(arr_6)"""[[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.][1. 1. 1. 1.][1. 1. 1. 1.][1. 1. 1. 1.]]"""

(5)数组合并:concatenate

参数说明:axis=0,纵向合并;axis=1,横向合并,默认axis=0arr_i = np.concatenate((arr_3, arr_4), axis=0)print(arr_i) # 沿着axis=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.]]"""arr = np.concatenate((arr_3, arr_4), axis=1)print(arr) # 沿着axis=1轴的方向进行拼接"""[[0. 0. 0. 0. 1. 1. 1. 1.][0. 0. 0. 0. 1. 1. 1. 1.][0. 0. 0. 0. 1. 1. 1. 1.]]"""concatenate与hstack/vstack的区别:二维数组区别不大,主要在一维数组(一维数组只有一个轴)concatenate是严格沿着数组的轴的方向拼接的,一维数组只有一个轴,因此只有一种拼接方式;hstack/vstack不关注有几个轴,只是单纯按照纵向或横向方向堆叠即可,因此一维数组也有两种堆叠方式;vstack可以将两个一维数组变成一个二维数组ar_1 = np.array([1, 2, 3, 4])ar_2 = np.array([0, 1, 1, 2])print(np.concatenate((ar_1, ar_2), axis=0)) # [1 2 3 4 0 1 1 2]print(np.concatenate((ar_1, ar_2), axis=1)) # 会报错print(np.vstack((ar_1, ar_2)))"""[[1 2 3 4][0 1 1 2]]"""

(6)数组分割:split

横向分割:列索引取值print(np.hsplit(arr, 4))"""[array([[0., 0.],[0., 0.],[0., 0.]]), array([[0., 0.],[0., 0.],[0., 0.]]), array([[1., 1.],[1., 1.],[1., 1.]]), array([[1., 1.],[1., 1.],[1., 1.]])]"""print(np.hsplit(arr, [3,7,9]))"""[array([[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]]), array([[0., 1., 1., 1.],[0., 1., 1., 1.],[0., 1., 1., 1.]]), array([[1.],[1.],[1.]]), array([], shape=(3, 0), dtype=float64)] # 因为最后没有数据了,所以是空数组"""也可以写成print(np.hsplit(arr, np.array([3,7,9])))# 将其分割为2,2,3,1 [2,4,7] 最后不写值就是取值到到最后# 纵向分割print(np.vsplit(arr_i, 3))"""[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.]])]"""# 沿着指定轴切割print(np.split(arr_i, 3, axis=0))"""[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.]])]"""

7、数组运算

注意:数组之间的运算都是对应元素的运算

(1)四则运算:+、-、*、/、**、%

arr17 = np.arange(1, 17).reshape((4, 4))print(arr17)arr18 = np.diag([2, 3, 1, 5])print(arr18)直接运算即可print(arr17 + arr18)"""[[ 3 2 3 4][ 5 9 7 8][ 9 10 12 12][13 14 15 21]]"""# print(arr17 - arr18)"""[[-1 2 3 4][ 5 3 7 8][ 9 10 10 12][13 14 15 11]]"""# print(arr17 * arr18)"""[[ 2 0 0 0][ 0 18 0 0][ 0 0 11 0][ 0 0 0 80]]"""# print(arr18 / arr17)# print(arr17 ** arr18)# print(arr18 % arr17)

(2)比较运算:< > == <= >= !=

print(arr18 < arr17) # 就是每个元素之间的比较"""[[False True True True][ True True True True][ True True True True][ True True True True]]"""取出arr17中大于8的数定义maskmask = arr17 > 8数组可以与值进行比较,是将数组的所有元素与数值进行比较print(mask) # 返回值是True或False,"""[[False False False False][False False False False][ True True True True][ True True True True]]"""print(arr17[mask]) # [ 9 10 11 12 13 14 15 16]

注意:定义好mask后,后边其他数组拿来用时,mask还是之间的mask(mask的True和False并没有改变)。

(3)逻辑运算

a、逻辑与运算:print(np.all(mask)) # Falseb、逻辑或运算:print(np.any(mask)) # True

(4)数组广播:只有一行或一列才能广播

二维数组 + 列向量arr19 = np.array([[1], [0], [1], [0]])print(arr17 + arr19)"""[[ 2 3 4 5][ 5 6 7 8][10 11 12 13][13 14 15 16]]"""二维数组 + 行向量arr20 = np.array([0, 1, 0, 1])print(arr17 + arr20)"""[[ 1 3 3 5][ 5 7 7 9][ 9 11 11 13][13 15 15 17]]"""

(5)特殊方法

a、排序(一维数组)arr21 = np.array([21, 10, 20, 8, 15, 1])排序、并修改原始数组arr21.sort()print(arr21) # [ 1 8 10 15 20 21](二维数组)arr22 = np.array([[12, 2, 10, 9], [2, 90, 25, 1]])print(arr22)"""[[12 2 10 9][ 2 90 25 1]]"""arr22.sort()print(arr22)"""[[ 2 9 10 12][ 1 2 25 90]]"""arr22.sort(axis=0) # 0:纵向排序,1:横向排序,不写为横向排序"""[[ 2 2 10 1][12 90 25 9]]"""b、argsort注意:argsort返回的值是索引,是原数组元素的索引,然后排好序如:下方一维数组的返回值,最后为0,那么原数组索引为0的元素就是最大的第一个为5,那么原数组索引为5的元素是最小的(一维数组)print(arr21.argsort()) # [5 3 1 4 2 0] --> 索引(二维数组)print(arr22.argsort(axis=1))结果为排序前的索引"""[[1 3 2 0][3 0 2 1]]"""c、去重:unique去重后整行与整列去重:axis=0表示对比整行数,如果整行值都相同,则进行去重axis=1表示对比整列数,如果整列值都相同,则进行去重默认axis=None,展平排序注:去重会进行排序,一维数组直接排序,二维数组会比较数组的第一个数,如果第一个数相同会比较第二个数,直到不一样时,进行排序(列去重会比较每一列的第一个数)。arr = np.array([21,2,21,1,0,1])np.unique(arr) # array([ 0, 1, 2, 21])arr2 = np.array([[1,2,1,2],[0,2,0,2]])np.unique(arr2) # 返回的是一个一维数组np.unique(arr2,axis=0) # 将每一行数组看成一个整数,当这一行与其他行完全相同时,去掉它np.unique(arr2,axis=1) # 将每一列数组看成一个整数,当这一列与其他列完全相同时,去掉它

(6)文件操作

a、二进制文件的生成np.save('arr',arr3) # save保存默认为.npy文件,只能保存一个数组b、读取二进制文件:load注意:读取时必须是完整的文件名,注意加上后缀名np.load('arr.npy')c、多个数组的保存与读取np.savez('arrz',arr,arr1) # savez保存默认为.npz文件,可以保存多个数组data = np.load('arrz.npz')print(data) # 是一个对象print(list(data)) # 查看npzfile下的npy文件:['arr_0', 'arr_1']# 提取某个值print(data['arr_0'])d、.txt文件的保存与读取np.savetxt('arr2',arr2,fmt='%d'(数字),delimiter=','(以逗号分隔)) # 保存为txt文件np.loadtxt('arr2',delimiter=',',dtype=‘str’(以字符串类型查看内容))

7、统计分布方法

注意:统计分布方法中都有axis参数可以传入,并且获取每行或者每列时返回的多个值是数组形式的。

(1)最小值

print('获取整个数组中最小的值:\n',arr.min())print('获取每一行的最小值:\n',arr.min(axis=1))print('获取每一列的最小值:\n',arr.min(axis=0))

(2)最大值

print('获取整个数组中最大的值:\n',arr.max())print('获取每一行的最大值:\n',arr.max(axis=1))print('获取每一列的最大值:\n',arr.max(axis=0))

(3)最小值索引

print(arr.argmin())print(arr.argmin(axis=1))print(arr.argmin(axis=0))

(4)最大值索引

print(arr.argmax())print(arr.argmax(axis=1))print(arr.argmax(axis=0))

(5)标准差

注意:方差与标准差可以反映数据的分布:当标准差与方差越大,表示数据越分散;当标准差与方法越小,数据越集中

print(“标准差:\n”,arr.std())

print(“标准差:\n”,arr.std(axis=0)) # 一列一列计算

print(“标准差:\n”,arr.std(axis=1)) # 一行一行计算

(6)方差

print("方差:\n",arr.var())# 也有axis方法

(7)求和

print(arr.sum())print('按行求和:\n',arr.sum(axis=1))print('按列求和:\n',arr.sum(axis=0))

(8)平均值

print('平均值:\n',arr.mean())print('按行求平均值:\n',arr.mean(axis=1))print('按列求平均值:\n',arr.mean(axis=0))

(9)累计求和

它的返回值是每做一次运算就返回一个值

print('累计求和:\n',arr.cumsum())# [ 1 3 7 13 15 17 21 41 44 53 73 78]

(10)累计求积

print('累计求积:\n',arr.cumprod())

四、习题

1、矩阵

解答:

import numpy as np# 1.mat1 = np.mat("1 0 0;0 2 0;0 0 3")# print(mat1.I)# 2.# print(mat1**6)mat2 = np.mat("4 0 0;0 5 0;0 0 6")# print(mat1+mat2)# print(mat1-mat2)# print(np.multiply(mat1,mat2))# 3."""AB = A +2BA = AB - 2BA = (A-2E)BB = A·(A-2E)逆"""E = np.mat("1 0 0;0 1 0;0 0 1")A = np.mat("0 3 3;1 1 0;-1 2 3")# C = A-2EC = A - 2 * ED = C.IB = A * D# print(B)# 4.(1)"""y代表系数矩阵x代表未知数矩阵z代表和矩阵yx = zx = z*y逆"""y1 = np.mat("1 2 3;2 2 5;3 5 1")# x = np.mat("x1 x2 x3")z1 = np.mat("1 ;2 ;3")y_n1 = y1.I# print(y_n)x1 = y_n1 * z1# print(x)# (2)"""y代表系数矩阵x代表未知数矩阵z代表和矩阵yx = zx = z*y逆"""y2 = np.mat("1 1 1;1 2 4;1 3 9")z2 = np.mat("2;3;5")y_n2 = y2.Ix2 = y_n2 * z2print(x2)

2、数组

表格格式如上图所示:A、B、C、D、E 分别对应下图中蓝色框内的五个数组, 并且分布为五日对应的销售数据;

每个数组中 0-3 行分别对应地区: 福建, 浙江, 广州, 江苏;每列分别代表销售的水果种类;

(1)分别创建 A/B/C/D/E 五个数组;

(2)将上述五个小数组合成大数组,使其成为完整一张表格;

(3)完成如下几个操作:

比较第 1 日,福建省销售水果的情况,并按照销售量大小进行排序;第 5 日中,苹果在哪个省份比较畅销?哪些水果在相应省份 2 日比第 1 日卖的好?计算 5 日内,四种水果分别再四个地区的总销量;计算 5 日内,哪种水果在某一个地区的销量超过 6500?如果在江苏上售卖水果,应该选择哪种水果比较好?为什么?

解答

import numpy as np(1)、分别创建A,B,C,D,E五个数组,还有省份和水果种类数组address = ['福建','浙江','广东','江苏']fruits = ['苹果','猕猴桃','枇杷']A = np.array([[, 0, 1779], [4103, 2505, 0], [2861, 1688, 0], [0, 0, 1213]])B = np.array([[4134, , 0], [2674, 1309, 2658], [0, 0, 4537], [4353, 2600, 4235]])C = np.array([[3824, 0, 4291], [0, 0, 3636], [4050, 2146, 2137], [1125, 566, 0]])D = np.array([[4339, 0, 4733], [4571, 3050, 0], [0, 0, 1196], [2864, 1656, 0]])E = np.array([[0, 0, 2606], [2370, 0, 4481], [1980, 1216, 0], [3671, 0, 4530]])(2)、将上述五个小数组合成大数组,使其成为完整一张表格arr = np.array([A, B, C, D, E])# print(arr)(3)、完成以下操作1、比较第1日,福建省销售水果的情况,并按照销售量大小进行排序arr1 = A[:1, ::]arr1.sort()print(arr1) # [[ 0 1779 ]]2、第5日中,苹果在哪个省份比较畅销? ----> 江苏arr2 = E[::, :1]print(arr2.argsort(axis=0))"""[[0][2][1][3]]"""m = arr2.argsort(axis=0)[-1][0]print(arr2[m]) # [3671]"""[[0] # 福建[2] # 浙江[1] # 广东[3]] # 江苏"""3、哪些水果在相应省份2日比第1日卖的好?# print(B > A)res = B > Aprint(res)"""[[ True True False][False False True][False False True][ True True True]]"""for i in range(4): # 省份for j in range(3): # 种类if res[i][j]: # 如果res的值为Trueprint(address[i]+'的'+fruits[j]+'第2日比第1日卖的好')"""福建的苹果第2日比第1日卖的好福建的猕猴桃第2日比第1日卖的好浙江的枇杷第2日比第1日卖的好广东的枇杷第2日比第1日卖的好江苏的苹果第2日比第1日卖的好江苏的猕猴桃第2日比第1日卖的好江苏的枇杷第2日比第1日卖的好"""4、计算5日内,四种水果分别在四个地区的总销量G = (A+B+C+D+E)print(G)"""[[14317 13409][13718 6864 10775][ 8891 5050 7870][1 4822 9978]]"""5、计算5日内,哪种水果在某一地区的销量超过6500?print(G > 6500)"""[[ True False True][ True True True][ True False True][ True False True]]"""6、如果在江苏售卖水果,应该选择哪种水果比较好?为什么?choice_foods = G[3].argsort()[-1]for i in range(3):if choice_foods == i :print('卖'+fruits[i]+'比较好,因为卖的最多')# 卖苹果比较好,因为卖的最多

3、练习

读取一个npz文件,因为无法上传,直接写出内容

1、['工号' '姓名' '部门' '岗位' '薪资' '工龄' '满意度' '状态']2、[['lol-1' '孙悟空' '战士' '上单' '50000' '10' '3' '离职']['lol-10' '光辉' 'AP' '中单' '10000' '3' '2' '在职']['lol-11' '石头人' '坦克' '辅助' '5000' '3' '1' '在职']['lol-12' '萝莉' 'AD' '射手' '50000' '3' '3' '离职']['lol-13' '提莫' 'AP' '辅助' '2500' '3' '2' '在职']['lol-14' '狗头' '战士' '上单' '11000' '3' '1' '在职']['lol-15' '轮子妈' 'AD' '射手' '12500' '3' '1' '在职']['lol-16' '冰鸟' 'AP' '辅助' '20000' '2' '2' '在职']['lol-17' '牛头' '坦克' '辅助' '8000' '2' '1' '在职']['lol-18' '剑豪' '刺客' '中单' '2500' '2' '2' '在职']['lol-19' '男刀' '刺客' '中单' '20000' '2' '1' '在职']['lol-2' '剑圣' '刺客' '打野' '25000' '6' '2' '在职']['lol-20' '阿木木' 'AP' '打野' '13500' '1' '3' '离职']['lol-3' '寒冰' 'AD' '射手' '15000' '5' '2' '在职']['lol-3' '寒冰' 'AD' '射手' '15000' '5' '2' '在职']['lol-4' '影子' '刺客' '中单' '30000' '5' '3' '离职']['lol-5' '蒙多' '坦克' '上单' '8000' '5' '1' '在职']['lol-6' '小炮' 'AD' '射手' '20000' '5' '2' '在职']['lol-7' '盖伦' '战士' '上单' '12000' '5' '1' '在职']['lol-7' '盖伦' '战士' '上单' '12000' '5' '1' '在职']['lol-8' '蛇女' 'AP' '中单' '13000' '4' '3' '离职']['lol-9' '蛮王' '战士' '上单' '8000' '4' '3' '离职']]

要求:

各部门有多少名员工?员工总体流失率是多少?员工平均薪资是多少?员工平均工作年限是多少?公司任职时间最久的三名员工是谁?员工整体满意度如何?

解答

方法不唯一,我自己写的可能复杂了。

from collections import Counterimport numpy as npdata = np.load('yingxionglianmeng.npz', allow_pickle=True)# print(list(data))arr0 = np.array(data['arr_0'])arr1 = np.array(data['arr_1'],dtype='str')arr1 = np.unique(arr1, axis=0)print(arr1)# 1、各部门有多少名员工?department_arr = arr1[::,2]print(Counter(department_arr)) # Counter({'AP': 5, '战士': 4, 'AD': 4, '刺客': 4, '坦克': 3})# 2、员工总体流失率是多少?state = arr1[:, 7]lz_sum = Counter(state)['离职']lz_rate = lz_sum / state.size# 转换为百分号方法一:print("%.2f%%" % (lz_rate * 100)) # 30.00%# 方法二:print(str(lz_rate * 100)[:2] + '%') # 30%# 3、员工平均薪资是多少?salary_sum = arr1[:,4].astype("int")a = salary_sum.cumsum()[-1]avg_salary = a / arr1[:, 4].sizeprint(avg_salary) # 16800.0# 4、员工平均工作年限是多少?# 方法一:a = arr1[:, 5].astype("int")print(a.mean()) # 3.8# 方法二:year_arr = np.array([int(i) for i in arr1[:, 5]])print(year_arr.mean()) # 3.8# 5、公司任职时间最久的三名员工是谁?len_year = arr1[:, 5].astype("int")sy = len_year.argsort()[-3:]hero_name = arr1[:, 1][sy][::-1]print("在公司任职时间最久的三名员工是:", hero_name)# 6、员工整体满意度如何?satisfaction = arr1[:, -2].astype("int")avg_satisfaction = satisfaction.cumsum()[-1] / satisfaction.sizeprint("员工整体满意度为:",avg_satisfaction)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。