# encoding=utf-8
import numpy as np
x = []
#欧几里得距离
def distance_betwin_p(p1,p2):
np.sqrt((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) ** 2)
#创建一个指定行列的数组,默认值是0或者正无穷或负无穷 ∞
np.empty((3,4))
#科学计数法的读法
1.23e3 #1.23x10的三次方
1.23e-3 #1.23x10负三次方
#实数在计算机里没有对应表示,只能用浮点数无限逼近。所以在处理和0比较的时候要格外小心
#a - b < 0.1e-10 例如相减的时候当结果小于一个极小的数值就认为相等
#矢量是有方向和长度的变量,可以用numpy的多维数组来表示,二维矢量就是平面的一个点
#计算矢量X的范数(长度)
np.linalg.norm(x)
#计算矢量的角度
d = np.arctan(3.0/3.0)
#将弧度转化为角度
np.rad2deg(d) #np.deg2rad()将角度转化为弧度
#向b1方向移动,再向b2方向移动
b1 = np.array([3,0])
b2 = np.array([0,3])
np.linalg.norm(b1 + b2)
#使用两个矢量相减,可以计算两点之间的距离
d1 = np.array([2,7])
d2 = np.array([8,3])
np.linalg.norm(d1 - d2)
#余弦相似度,向量的内积,对应元素想乘,再相加
costheta = d1.dot(d2)/(np.linalg.norm(d1) * np.linalg.norm(d2))
#numpy数组(矢量)默认的+ - x /操作都是对应位置的元素相操作
#-3x**2+5x-6
#TypeError: unsupported operand type(s) for -: 'list' and 'list'
#在X轴上生成20000个从-10000到10000的离散点
#使用矢量计算直接生成多项式-3x**2+5x-6的所有计算结果,注意这里没有使用循环,一次计算了20000个结果
X = np.linspace(-10000,10000,20000)
Y = (X ** 2) * -3 + 5 * X - 6 #矢量运算,计算机会加速此类运算
Y.max()#获取当前矢量中的最大值
Y.argmax()#获取当前数组最大值对应的索引
np.nan #not a number 当数据读取缺失或计算异常时会出现,本质是一个浮点数
np.inf #无穷大
np.exp(10)#以e为底的指数
np.log(10)#对数
np.sin(10)#三角函数
np.sqrt(10)#开方
X.astype(np.int)#将数组类型强制转换为int
X.shape #返回X数组的行列数
n_array = np.array([[1,2,3,4,5],[6,7,8,9,0],[3,4,5,6,7],[7,6,5,4,3],[6,8,9,2,3]])
n_array < 60 #返回满足条件的布尔类型矩阵
n_array[n_array < 60]#将a_array中小于60的数值选择出来
n_array.mean() #求平均值
n_array.std() #标准差
n_array.max() #最大值
n_array.min() #最小值
#n_array[:,1] #选择当前二维数组第二列
#n_array[1,:] #选择当前二维数组第二行
#n_array[:,:,1] #选择当前三维数组第三个维度第二列的所有内容
# def poly_test(l,r,):
# r_len = r - l
# max_num = -1000000
# m_idx = l
# for i in range(r_len):
# r_num = l+i
# result = (r_num ** 2) * -3 + (5* r_num) - 6
# if result > max_num:
# max_num = result
# m_idx = i
#
# return max_num,m_idx
#
# print poly_test(-10000,10000)
my_matrix = np.loadtxt(open("score.csv","rb"),delimiter=",")
#my_matrix = np.genfromtxt("score.csv",delimiter=",")
#该班级哪门课程成绩最好
#该班哪个同学成绩最好
#该班哪个同学偏科最严重
#该班哪门主课成绩最好
#该班主课和副课对比哪个成绩好
#这个班有多少学生出现了不及格
name_dic = {0:"数学",1:"语文",2:"化学",3:"地理",4:"音乐",5:"体育"}
class CoursaDesc(object):
def __init__(self):
self.name = ""
self.std = 0
self.max = 0
self.mean = 0
self.min = 0
self.sum = 0
class ComputerDesc(object):
def __init__(self,n_array):
self.score_array = n_array
self.result = []
def counter_all_coursa(self):
for i in range(6):
c_desc = CoursaDesc()
c_desc.name = name_dic[i]
c_desc.std = self.score_array[:,i].std()
c_desc.mean = self.score_array[:,i].mean()
c_desc.max = self.score_array[:,i].max()
c_desc.min = self.score_array[:,i].min()
c_desc.sum = self.score_array[:,i].sum()
self.result.append(c_desc)
def best_coursa(self):
# std_list = [coursa.std for coursa in self.result]
# sum_list = [coursa.sum for coursa in self.result]
std_list = []
sum_list = []
for coursa in self.result:
std_list.append(coursa.std)
sum_list.append(coursa.sum)
std_array = np.array(std_list)
sum_array = np.array(sum_list)
#总和最大的单项成绩,例如:数学成绩的max_sum_coursa也就是总和是701
max_sum_coursa = sum_array.max()
max_sum_index = sum_array.argmax()#数学成绩总和的索引,例如是0
#方差最小的单项成绩,例如:体育成绩的min_std_coursa也就是方差是30
min_std_coursa = std_array.min()
min_std_index = std_array.argmin()#方差最小成绩的索引,例如是6
if max_sum_index == min_std_index:
return name_dic[max_sum_index]
else:
#总和最大课程的方差取出
max_sum_coursa_std = std_array[max_sum_index]
#方差最小课程的总和取出
min_std_soursa_sum = sum_array[min_std_index]
sum_delta = max_sum_coursa - min_std_soursa_sum
std_delta = max_sum_coursa_std - min_std_coursa
sum_percent = sum_delta / max_sum_coursa
std_percent = std_delta / min_std_coursa
if sum_percent < 0.05 and std_percent > 0.2:
return name_dic[min_std_index]