当前位置:首页经验技巧Excel经验excel入门

numpy读excel数据,电子表格numpy操作excel

2024-07-15 14:23:54

1. numpy操作excel

在一个中小型的留学机构之内,很多的同学都是托管为主,而上课的老师可能是国内聘请的老师面授,也可能是在国外的老师通过网上授课,还需要使用付费的网络会议软件(zoom)。因此,每次排课表都是一件痛苦的工作。其实,也没有什么很好的方法,就是一个一个试,如果恰巧大家时间比较充裕,那么可能一次排成,但有时可能是很久。因此,一个建议的排课系统是很有必要的。

好在,一般来说,学生和老师的数量不是很多,往往课表的可能性还是很多的。

1. 必要准备

Jupyter Notebook

pandas

特定格式的Excel 表格

2. 获取必要的数据

电脑需要读取数据来获得学生的空余时间,老师的空余时间和需要的课程(包括课程的数量,老师和学生,是否需要zoom)。目前,我们可以将课表一周一周的进行安排,一周分为7天,一天分为一定的时段。在Excel表格中,1代表有时间,0代表没有时间。具体来说,Excel的表格格式如下:

这是一位托管学生的空闲时间,可以看出时间大部分是空余的,但是对于一般的老师和同学来说,不一定会如此简单。

课程的表格需要如下:

老师,同学,课程名字和zoom是否需要。

此处没有定义课程的数量,一次课占一行,因为如果定义数量,电脑则会直接把同一种课安排在一起。

下面进入编程阶段,主要需要三个部分 读取数据 ~> 制作课表 ~> 导出Excel

3. 读取所有的数据

在这里,我们要求把学生和老师的空余时间分到不同的文件夹,且Excel为学生或者老师的名字。

现在假设读者已经会使用Jupyter Notebook,并且已经安装好了pandas。

在terminal输入:

jupyter notebook

在浏览器上应该是localhost:8888/tree,进入如下界面:

在装有文件的文件夹下,新建一个notebook file,然后import:

import re \\regular expression 正则表达式

import os \\operating system 操作系统

import numpy as np \\ 用来进行矩阵计算

import pandas as pd \\ 用来读取文件,数据

2. numpy操作中的注意事项

在安卓上有一个挺强大的app叫pydroid

有可以安装一些库,甚至还有tensorflow,不过要钱的,我没试过。

支持pyqt5,numpy

不过要注意的是,有些功能像pyqt5要安装插件app,这些在google play上安装,国内上不去。

3. numpy操作数据库

人脸识别mysql数据库起数据提供参照作用,实现多项参照,精准解析:

需求描述

1.将人脸特征信息保存进MySQL数据库。

2.调用摄像头识别人脸,将待识别的人物进行识别,并实时地与数据库中的人脸特征信息进行比对,同时判断出被识别者的身份。

需求分析

1、准备

利用opencv、face_recognition、numpy、pymysql等Python第三方类库,官方说法是face_recognition的人脸识别准确率高达99.6%。

2、识别

利用face_recognition,可以很轻易地得到人脸128维的人脸编码,并且通过比对函数,就可以得出想要的结果。

3、编码

由于face_recognition的128维的人脸编码是一个numpy ndarray类型,即矩阵,并不能存进数据库,要想存进数据库,必须进行类型转换

思路:先将矩阵转为列表,再将列表里的每个元素转为字符串,再用字符串拼接的方式拼成一个字符串,这时就可以把特征值存进数据库了。

4.译码

既然是特征值的比对,那么从数据库取完数据之后,就需要把字符串重新转为矩阵格式。

思路:先通过字符串切割,转为列表,再对列表里每个元素转为浮点型(float),最后再转为矩阵。

5.输出

常规做法通过人脸识别后想要在图像上输出被识别者姓名,但是opencv有自己的一套编码规范,无法输出中文,如果保存的是中文,那么就会出现乱码的情况。

中文文字图像显示解决思路:通过调用本地已存在的字体,利用PIL进行格式转换。

解决方案

数据库设计 

FaceSQL.py:MySQL数据库处理相关

import pymysql

class FaceSQL:

def __init__(self):

self.conn = pymysql.connect(

# 数据库的IP地址

host="xxx.xxx.xxx.xxx",

# 数据库用户名称

user="******",

# 数据库用户密码

password="******",

# 数据库名称

db="xxx",

# 数据库端口名称

port=3306,

# 数据库的编码方式 注意是utf8

charset="utf8"

)

def processFaceData(self, sqlstr, args=()):

print(sqlstr)

# 使用 cursor() 方法创建一个游标对象 cursor

cursor = self.conn.cursor()

try:

# 执行sql语句

cursor.execute(sqlstr, args)

# 提交到数据库执行

self.connmit()

except Exception as e:

# 如果发生错误则回滚并打印错误信息

self.conn.rollback()

print(e)

finally:

# 关闭游标

cursor.close()

def saveFaceData(self,id,encoding_str):

self.processFaceData("insert into face(学号,encoding) values(%s,%s)", (id, encoding_str))

def updateFaceData(self, id, encoding_str):

self.processFaceData("update face set encoding = %s where 学号 = %s", (encoding_str, id))

def execute_float_sqlstr(self, sqlstr):

# 使用 cursor() 方法创建一个游标对象 cursor

cursor = self.conn.cursor()

# SQL插入语句

results = []

try:

# 执行sql语句

cursor.execute(sqlstr)

# 获取所有记录列表

results = cursor.fetchall()

except Exception as e:

# 如果发生错误则回滚并打印错误信息

self.conn.rollback()

print(e)

finally:

# 关闭游标

cursor.close()

return results

def sreachFaceData(self, id):

return self.execute_float_sqlstr( "select * from face where 学号="+id)

def allFaceData(self):

return self.execute_float_sqlstr( "select * from face ")

def sreach_Info(self,id):

return self.execute_float_sqlstr( "select * from zstustu where 学号='" + id + "'")

FaceTools.py: 人脸特征信息处理相关

import face_recognition

import numpy

from os import listdir,path

from FaceSQL import FaceSQL

class FaceTools:

def __init__(self):

try:

self.facesql=FaceSQL()

except :

print("数据库连接错误")

def encoding_FaceStr(self, image_face_encoding):

# 将numpy array类型转化为列表

encoding__array_list = image_face_encoding.tolist()

# 将列表里的元素转化为字符串

encoding_str_list = [str(i) for i in encoding__array_list]

# 拼接列表里的字符串

encoding_str = ','.join(encoding_str_list)

return encoding_str

def decoding_FaceStr(self, encoding_str):

# print("name=%s,encoding=%s" % (name, encoding))

# 将字符串转为numpy ndarray类型,即矩阵

# 转换成一个list

dlist = encoding_str.strip(' ').split(',')

# 将list中str转换为float

dfloat = list(map(float, dlist))

face_encoding = numpy.array(dfloat)

return face_encoding

def add_Face(self,image_name, id):

# 加载本地图像文件到一个numpy ndarray类型的对象上

image = face_recognition.load_image_file("./photo/"+image_name)

# 返回图像中每个面的128维人脸编码

# 图像中可能存在多张人脸,取下标为0的人脸编码,表示识别出来的最清晰的人脸

image_face_encoding = face_recognition.face_encodings(image)[0]

encoding_str =self.encoding_FaceStr(image_face_encoding)

# 将人脸特征编码存进数据库

self.facesql.saveFaceData(id,encoding_str)

def updata_Face(self, image_name, id):

# 加载本地图像文件到一个numpy ndarray类型的对象上

image = face_recognition.load_image_file("./photo/"+image_name)

# 返回图像中每个面的128维人脸编码

# 图像中可能存在多张人脸,取下标为0的人脸编码,表示识别出来的最清晰的人脸

image_face_encoding = face_recognition.face_encodings(image)[0]

encoding_str = self.encoding_FaceStr(image_face_encoding)

# 将人脸特征编码更新数据库

self.facesql.updateFaceData(id, encoding_str)

def sreach_Face(self, id):

face_encoding_strs = self.facesql.sreachFaceData(id)

# 人脸特征编码集合

face_encodings = []

# 人脸特征姓名集合

face_names = []

for row in face_encoding_strs:

name = row[0]

face_encoding_str = row[1]

# 将从数据库获取出来的信息追加到集合中

face_encodings.append(self.decoding_FaceStr(face_encoding_str))

face_names.append(name)

return face_names,face_encodings

def load_faceoffile(self):

filepath = 'photo'

filename_list = listdir(filepath)

# 人脸特征编码集合

face_encodings = []

# 人脸特征姓名集合

face_names = []

a = 0

for filename in filename_list: # 依次读入列表中的内容

a += 1

if filename.endswith('jpg'): # 后缀名'jpg'匹对

face_names.append(filename[:-4]) # 把文件名字的后四位.jpg去掉获取人名

file_str = 'photo' + '/' + filename

a_images = face_recognition.load_image_file(file_str)

print(file_str)

a_face_encoding = face_recognition.face_encodings(a_images)[0]

face_encodings.append(a_face_encoding)

print(face_names, a)

return face_names,face_encodings

def load_faceofdatabase(self):

try:

face_encoding_strs = self.facesql.allFaceData()

except:

print("数据库连接错误")

# 人脸特征编码集合

face_encodings = []

# 人脸特征姓名集合

face_names = []

for row in face_encoding_strs:

name = row[0]

face_encoding_str = row[1]

# 将从数据库获取出来的信息追加到集合中

face_encodings.append(self.decoding_FaceStr(face_encoding_str))

face_names.append(name)

return face_names, face_encodings

def load_images_face(self,filepath):

filename_list = listdir(filepath)

for filename in filename_list: # 依次读入列表中的内容

if path.isdir(filepath+filename):

self.load_images_face(filepath+filename+"\\")

if filename.endswith('jpg'): # 后缀名'jpg'匹对

file_str = filepath + filename

a_images = face_recognition.load_image_file(file_str)

print(file_str)

face_encoding = face_recognition.face_encodings(a_images)

if face_encoding != []:

a_face_encoding = face_encoding[0]

encoding_str = self.encoding_FaceStr(a_face_encoding)

self.facesql.saveFaceData(filename[:-4], encoding_str)

def load_images_faces(self, filepath):

filename_list = listdir(filepath)

a=0

for filename in filename_list: # 依次读入列表中的内容

if filename.endswith('jpg'): # 后缀名'jpg'匹对

file_str = filepath + filename

a_images = face_recognition.load_image_file(file_str)

print(file_str)

face_encoding = face_recognition.face_encodings(a_images)

for a_face_encoding in face_encoding:

a += 1

encoding_str = self.encoding_FaceStr(a_face_encoding)

self.facesql.saveFaceData(filename[:-4] + "-" + str(a), encoding_str)

运行结果

4. numpy基本操作

切片操作:对list,tuple元素进行截取操作,非常简便。 L[0:3],L[:3] 截取前3个元素。

L[1:3] 从1开始截取2个元素出来。 L[-1] 取倒数第一个元素出来。

L[-10] 取后10个数 L[10:20] 取前11-20个数 L[:10:2] 取前10个数,每两个取一个 L[::5] 所有数,每5个取一个 L[:] 原样复制一个list tuple,字符串也可以进行切片操作 >>> a=[1,2,3,4,5,6,7,8] >>> a[:-1:] [1, 2, 3, 4, 5, 6, 7] >>>

5. numpy操作图片

numpy的主要功能:1. ndarray,一个多维数据结构,高效且节省空间。

2. 无需循环对整组数据进行快速运算的数学函数。

3. 读写磁盘数据的工具以及用于操作内存映射文件的工具。

4. 线性代数、随机数生成和傅里叶变换功能。

5. 用户集成C、C++等代码的工具。

6. numpy操作csv

使用pandas读取的方法是

pandas.to_csv()

得到的结果是dataframe格式,再用numpy库转一下

具体代码:

import pandas as pd

import numpy as np

file_content = pd.to_csv(r'C:\新建文件夹\result123.csv')

row = np.array(file_content)

lx = row.tolist(),希望我的回答对亲们有帮助

7. numpy操作数组的方法有哪些

关于numpy函数?

NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。


电脑版

免责声明:本站信息来自网络收集及网友投稿,仅供参考,如果有错误请反馈给我们更正,对文中内容的真实性和完整性本站不提供任何保证,不承但任何责任,谢谢您的合作。
版权所有:五学知识网 Copyright © 2015-2024 All Rights Reserved .