4 Numpy------ ndarray运算(逻辑运算、通用判断函数、三元运算符 、统计指标、案例:学生成绩统计运算、数组与数的运算、数组与数组的运算、广播机制)

文章目录

    • 4.4 ndarray运算
      • 学习目标
      • 1 逻辑运算
      • 2 通用判断函数
      • 3 np. where(三元运算符)
      • 4.1 统计指标
      • 4.2 案例:学生成绩统计运算
      • 5 小结
    • 4.5数组间运算
      • 学习目标
      • 1 数组与数的运算
      • 2 数组与数组的运算
      • 2.1 广播机制
      • 3 小结

4.4 ndarray运算

文章代码下载

学习目标

目标

  • 应用数组的通用判断函数
  • 应用 np.where实现数组的三元运算
    问题
    如果想要操作符合某一条件的数据,应该怎么做?

1 逻辑运算

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

2 通用判断函数

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

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)
array([[1, 0, 0, 0],
       [1, 1, 1, 1],
       [0, 0, 0, 0],
       [0, 1, 1, 0]])
#判断前四名学生,前四门课程中,成绩中大于90或小于60的换为1,否则为0
np.where(np.logical_or(temp > 90, temp<60),1, 0)
array([[0, 1, 1, 1],
       [0, 0, 0, 0],
       [1, 1, 0, 0],
       [1, 0, 0, 1]])

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 85 91 96 92]
前四名学生,各科成绩的最小分:[42 43 66 42 40]
前四名学生,各科成绩波动情况:[20.26542622 16.97608612 10.5        20.96872671 18.62793601]
前四名学生,各科成绩的平均分:[73.25 59.25 80.5  76.75 67.  ]

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

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

结果:

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

5 小结

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

4.5数组间运算

学习目标

目标

  • 知道数组与数之间的运算
  • 知道数组与数组之间的运算
  • 说明数组间运算的广播机制

1 数组与数的运算

arr=np.array([[1,2,3,2,1,4],[5,6,1,2,3,11])
arr+1
arr/2
#可以对比python列表的运算,看出区别
a=[1,2,3,4,5]
a*3

2 数组与数组的运算

arr1=np.array([[1,2,3,2,1,4],[5,6,1,2,3,1]])
arr2=np.array([[1,2,3,4],[3,4,5,6]])

上面这个能进行运算吗,结果是不行的!

2.1 广播机制


  数组在进行矢量化运算的,要求数组的形状是相等的.当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢量化运算了.下面通过一个例子进行说明:

arr1=np.array([[0],[1],[2],[3]])
arr1.shape
#(4,1)
arr2=np.array([1,2,3])
arr2.shape
#(3,)arrl+arr2

#结果是:

array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])

上述代码中,数组arr1是4行1列,arr2是1行3列.这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组ar1和ar2都变成4行3列.
下面通过一张图来描述广播机制扩展数组的过程:
4 Numpy------ ndarray运算(逻辑运算、通用判断函数、三元运算符 、统计指标、案例:学生成绩统计运算、数组与数的运算、数组与数组的运算、广播机制)_第1张图片
广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。

  • 1.数组的某一维度等长。
  • 2.其中一个数组的某一维度为1。

广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
如果是下面这样,则不匹配:

A(1d array):10
B(1d array):12
A(2d array):2×1
B(3d array):8×4×3

3 小结

  • 数组运算,满足广播机制,就OK[知道]
    - 1.维度相等
    - 2.shape(其中对应的地方为1,也是可以的)

点个赞吧!!!你的鼓励是对我码字的认可

你可能感兴趣的:(人工智能,机器学习,深度学习)