学习目标

  • 目标
    • 应用数组的通用判断函数
    • 应用np.where实现数组的三元运算

问题

如果想要操作符合某一条件的数据,应该怎么做?

1 逻辑运算

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

2 通用判断函数

  • np.all()

    1. # 判断前两名同学的成绩[0:2, :]是否全及格
    2. >>> np.all(score[0:2, :] > 60)
    3. False
  • np.any()

    1. # 判断前两名同学的成绩[0:2, :]是否有大于90分的
    2. >>> np.any(score[0:2, :] > 80)
    3. True

    3 np.where(三元运算符)

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

  • np.where()

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

    判断前四名学生,前四门课程中,成绩中大于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)

  1. <a name="xeI1p"></a>
  2. ## 4 统计运算
  3. **如果想要知道学生成绩最大的分数,或者做小分数应该怎么做?**
  4. <a name="B2hVj"></a>
  5. ### 4.1 统计指标
  6. 在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。常用的指标如下:
  7. - min(a, axis)
  8. - Return the minimum of an array or minimum along an axis.
  9. - max(a, axis])
  10. - Return the maximum of an array or maximum along an axis.
  11. - median(a, axis)
  12. - Compute the median along the specified axis.
  13. - mean(a, axis, dtype)
  14. - Compute the arithmetic mean along the specified axis.
  15. - std(a, axis, dtype)
  16. - Compute the standard deviation along the specified axis.
  17. - var(a, axis, dtype)
  18. - Compute the variance along the specified axis.
  19. <a name="hd50q"></a>
  20. ### 4.2 案例:学生成绩统计运算
  21. 进行统计的时候,**axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行去进行统计**
  22. ```python
  23. # 接下来对于前四名学生,进行一些统计运算
  24. # 指定列 去统计
  25. temp = score[:4, 0:5]
  26. print("前四名学生,各科成绩的最大分:{}".format(np.max(temp, axis=0)))
  27. print("前四名学生,各科成绩的最小分:{}".format(np.min(temp, axis=0)))
  28. print("前四名学生,各科成绩波动情况:{}".format(np.std(temp, axis=0)))
  29. print("前四名学生,各科成绩的平均分:{}".format(np.mean(temp, axis=0)))

结果:

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

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

  • np.argmax(temp, axis=)
  • np.argmin(temp, axis=)

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

    结果:

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

    5 小结

  • 逻辑运算【知道】

    • 直接进行大于,小于的判断
    • 合适之后,可以直接进行赋值
  • 通用判断函数【知道】
    • np.all()
    • np.any()
  • 统计运算【掌握】
    • np.max()
    • np.min()
    • np.median()
    • np.mean()
    • np.std()
    • np.var()
    • np.argmax(axis=) — 最大元素对应的下标
    • np.argmin(axis=) — 最小元素对应的下标