Python之Numpy系列详细教程【从零到入门】 -- 第三章 Numpy中ndarray运算

it2023-01-21  51

问题

如果想要对ndarray中的数据进行运算,应该怎么做呢?

1 逻辑运算

# 生成10名同学,5门功课的数据 >>> score = np.random.randint(40, 100, (10, 5)) # 取出最后4名同学的成绩,用于逻辑判断 >>> test_score = score[6:, 0:5] # 逻辑判断, 如果成绩大于60就标记为True 否则为False >>> test_score > 60 array([[ True, True, True, False, True], [ True, True, True, False, True], [ True, True, False, False, True], [False, True, True, True, True]]) # BOOL赋值, 将满足条件的设置为指定的值-布尔索引 >>> test_score[test_score > 60] = 1 >>> test_score array([[ 1, 1, 1, 52, 1], [ 1, 1, 1, 59, 1], [ 1, 1, 44, 44, 1], [59, 1, 1, 1, 1]])

2 通用判断函数

np.all() # 判断前两名同学的成绩[0:2, :]是否全及格 >>> np.all(score[0:2, :] > 60) False np.any() # 判断前两名同学的成绩[0:2, :]是否有大于90分的 >>> np.any(score[0:2, :] > 90) True

3 np.where(三元运算符)

通过使用np.where能够进行更加复杂的运算

np.where() # 判断前四名学生,前四门课程中,成绩中大于60的置为1,否则为0 temp = score[:4, :4] np.where(temp > 60, 1, 0) 复合逻辑需要结合np.logical_and和np.logical_or使用 # 判断前四名学生,前四门课程中,成绩中大于60且小于90的换为1,否则为0 np.where(np.logical_and(temp > 60, temp < 90), 1, 0) # 判断前四名学生,前四门课程中,成绩中大于90或小于60的换为1,否则为0 np.where(np.logical_or(temp > 90, temp < 60), 1, 0)

4 统计运算

如果想要知道学生成绩最大的分数,或者做小分数应该怎么做?

4.1 统计指标

在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。常用的指标如下:

min(a, axis) 最小值 Return the minimum of an array or minimum along an axis. max(a, axis]) 最大值 Return the maximum of an array or maximum along an axis. median(a, axis) 中值 Compute the median along the specified axis. mean(a, axis, dtype) 均值 Compute the arithmetic mean along the specified axis. std(a, axis, dtype) 标准差 Compute the standard deviation along the specified axis. var(a, axis, dtype) 方差 Compute the variance along the specified axis.

4.2 案例:学生成绩统计运算

进行统计的时候,axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行去进行统计

# 接下来对于前四名学生,进行一些统计运算 # 指定列 去统计 temp = score[:4, 0:5] print("前四名学生,各科成绩的最大分:{}".format(np.max(temp, axis=0))) print("前四名学生,各科成绩的最小分:{}".format(np.min(temp, axis=0))) print("前四名学生,各科成绩波动情况:{}".format(np.std(temp, axis=0))) print("前四名学生,各科成绩的平均分:{}".format(np.mean(temp, axis=0)))

输出结果:

前四名学生,各科成绩的最大分:[96 97 72 98 89] 前四名学生,各科成绩的最小分:[55 57 45 76 77] 前四名学生,各科成绩波动情况:[16.25576821 14.92271758 10.40432602 8.0311892 4.32290412] 前四名学生,各科成绩的平均分:[78.5 75.75 62.5 85. 82.25]

如果需要统计出某科最高分最低分对应的是哪个同学?

np.argmax(temp, axis=)np.argmin(temp, axis=) print("前四名学生,各科成绩最高分对应的学生下标:{}".format(np.argmax(temp, axis=0)))

输出结果:

前四名学生,各科成绩最高分对应的学生下标:[0 2 0 0 1]

5 矩阵乘法

np.matmulnp.dot >>> a = np.array([[80, 86], [82, 80], [85, 78], [90, 90], [86, 82], [82, 90], [78, 80], [92, 94]]) >>> b = np.array([[0.7], [0.3]]) >>> np.matmul(a, b) array([[81.8], [81.4], [82.9], [90. ], [84.8], [84.4], [78.6], [92.6]]) >>> np.dot(a,b) array([[81.8], [81.4], [82.9], [90. ], [84.8], [84.4], [78.6], [92.6]])

np.matmul和np.dot的区别:

二者都是矩阵乘法。 np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。

创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

Dragon少年 | 文

如果本篇博客有任何错误,请批评指教,不胜感激 !

最新回复(0)