Python numpy ndarray运算
0x01 逻辑运算
import numpy as np
# 生成40-100的10行5列数据
arr1 = np.random.randint(40, 100, (10, 5))
"""
#查看下arr1
arr1 Out[3]:
array([[95, 65, 74, 76, 64],
[95, 62, 74, 81, 59],
[48, 93, 87, 40, 63],
[99, 68, 57, 95, 51],
[75, 78, 43, 50, 49],
[75, 74, 86, 50, 98],
[62, 61, 53, 40, 73],
[58, 63, 99, 76, 85],
[52, 44, 65, 77, 51],
[90, 74, 93, 78, 46]])
"""
# 取6行开始取,每行取0-5列
arr2 = arr1[6:, 0:5]
"""
# 查看下arr2
arr2 Out[4]:
array([[62, 61, 53, 40, 73],
[58, 63, 99, 76, 85],
[52, 44, 65, 77, 51],
[90, 74, 93, 78, 46]])
# 逻辑运算,查看大于60的有哪些
arr2 > 60
Out[5]:
array([[ True, True, False, False, True],
[False, True, True, True, True],
[False, False, True, True, False],
[ True, True, True, True, False]])
# 把大于60的改成1
arr2[arr2 > 60] = 1
Out[8]:
array([[ 1, 1, 53, 40, 1],
[58, 1, 1, 1, 1],
[52, 44, 1, 1, 51],
[ 1, 1, 1, 1, 46]])
"""
0x02 通用判断函数
# np.all() 判断前两名学生成绩是否及格
np.all(arr1[0:2,:] > 60)
"""
Out[11]: False
"""
# np.any() 判断前两名学生成绩中是否有大于80的
np.any(arr1[0:2,:] > 80)
"""
Out[12]: True
"""
0x03 三元运算符 np.where
# 使用np.where 判断前4名学生成绩中,大于60置为1否则为0
temp = arr1[:4, :4]
"""
#查看temp
array([[95, 65, 74, 76],
[95, 62, 74, 81],
[48, 93, 87, 40],
[99, 68, 57, 95]])
"""
np.where(temp > 60, 1, 0)
"""
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[0, 1, 1, 0],
[1, 1, 0, 1]])
"""
# 复合逻辑需要结合np.logical and和np.logical or使用
# 判断前四名学生,前四门课程中,成绩中大于60且小于90的换为1,否则为0
np.where(np.logical_and(temp > 60, temp < 90), 1, 0)
"""
array([[0, 1, 1, 1],
[0, 1, 1, 1],
[0, 0, 1, 0],
[0, 1, 0, 0]])
"""
# 判断前四名学生,前四门课程中,成绩中大于90或小于60的换为1,否则为0
np.where(np.logical_or(temp > 90, temp < 60), 1, 0)
"""
array([[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 0, 1, 1]])
"""
0x04 统计指标
在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。进行统计的时候,axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样。常用的指标如下:
min(a,axis)
max(a,axis)
median(a,axis)
mean(a,axis,dtype)
std(a,axis,dtype)
var(a,axis,dtype)
# 接下来对于前四名学生,进行一些统计运算
# 指定列 去统计
temp = arr1[:4, 0:5]
"""
array([[78, 93, 57, 47, 67],
[45, 79, 50, 68, 64],
[66, 59, 65, 57, 99],
[53, 68, 89, 82, 50]])
"""
print(f"前四名学生,各科成绩的最大分:{np.max(temp, axis=0)}") # 前四名学生,各科成绩的最大分:[78 93 89 82 99]
print(f"前四名学生,各科成绩的最小分:{np.min(temp, axis=0)}") # 前四名学生,各科成绩的最小分:[45 59 50 47 50]
print(f"前四名学生,各科成绩波动情况:{np.std(temp, axis=0)}") # 前四名学生,各科成绩波动情况:[12.57974563 12.69596393 14.70331595 13.00961183 17.93042108]
print(f"前四名学生,各科成绩的平均分:{np.mean(temp, axis=0)}") # 前四名学生,各科成绩的平均分:[60.5 74.75 65.25 63.5 70. ]
# 如果需要统计出某科最高分对应的是哪个同学?
# np.argmax(temp, axis=)
# np.argmin(temp, axis=)
print(f"前四名学生,各科成绩最高分对应的学生下标: {np.argmax(temp,axis=0)}") # 前四名学生,各科成绩最高分对应的学生下标: [0 0 3 3 2]