今天开始把第一次编程练习了。代码及运行结果参见HW0-question1+2。
作业如下:
Question 1 矩陣運算
- 讀取 matrixA.txt 和 matrixB.txt 矩陣
- 進行矩陣乘法 - matrixA * matrixB, 將得到的矩陣數值,由小到大排序後輸出至ans_one.txt <\blockquote>
Question 2 基本圖片資料操作
- 讀取 lena.png 與 lena_modified.png
- 使用後者異於前者的部分產生相同格式的新圖檔 ans_two.png
准备工作
jupyter昨天配置好了,想到自己可能更习惯pycharm写程序就配置一下。开始想应该比较简单,setting设置一下就行,没想到出现了 "Environment location diretory is not empty ",当时没想明白问题在哪里,看到下面有一个 "Existing environment ",设置到虚拟环境DeepLearnningWu仍提示非空,突然想到应该选到编辑器也就是python版本而不是文件夹,果然里面有两个python.exe,选择了一个之后环境配置完成。
编程过程
问题一的解决
知识储备
问题一首先要解决的是python文件的读取,参考书如下,本书chap8。
[1] <python 编程快速上手——让繁琐工作自动化>,Ai Sweigart。
以下为学习过程:
- windows下文件路径用到斜杠 " \ "表示,因此路径里面会出现两个到斜杠,第一个用来转义。
- 创建文件名称的字符串用命令:
import os
os.path.join()
例如:
import os
os.path.join('usr','bin','spam')
输出结果为: 'usr\bin\spam'
扩展应用:将一个文件名列表中的名称,添加到文件夹名称的末尾。
myFiles = ['accounts.txt', 'details.csv', 'invite.docx']
for filename in myFiles:
print(os.path.join('c:\\Users\\asweigart', filename))
显示结果:
c:\Users\asweigart\accounts.txt
c:\Users\asweigart\details.csv
c:\Users\asweigart\invite.docx
- 显示当前工作目录:
os.getcwd()
改变当前工作目录:
os.chdir()
例子:
os.getcwd()
os.chdir('C:\\daka\\machine-learning-Li\\NTU-Machine-learning\\NTU-Machine-learning\\homework\\HW0')
os.getcwd()
显示结果: 'C:\Users\Jianyu';
'C:\daka\machine-learning-Li\NTU-Machine-learning\NTU-Machine-learning\homework\HW0'
若要更改的当前工作目录不存在,python会报错。
- 绝对路径与相对路径
绝对路径:从根文件开始的完整路径。
相对路径:从当前工作路径开始。
路径中可使用的特殊名称:
'.' :'这个目录'的缩写;
'..' : 父文件夹。 - 创建新文件夹
命令:
os.makedirs('文件夹的路径和名称')
- python处理文件、文件夹、文件路径的模块
os.path模块 - 处理绝对路径和相对路径
返回参数的绝对路径的字符串:
os.path.abspath(path)
例如:
os.path.abspath('.')
显示结果为:'C:\daka\machine-learning-Li\NTU-Machine-learning\NTU-Machine-learning\homework\HW0'(参见之前工作路径的设置,一致)
判断参数是否是绝对路径:
os.path.isabs()
例如:
os.path.abspath('..')
os.path.isabs('.')
os.path.isabs(os.path.abspath('.'))
显示结果为:False,True
查找第一个参数相对第二个参数的相对路径:
os.path.relpath('','')
例如:
os.path.relpath('C:\\daka\\machine-learning-Li','C:\\daka\\machine-learning-Li\\NTU-Machine-learning\\NTU-Machine-learning\\homework\\HW0')
结果显示为:'..\..\..\..'
返回参数的基本名称(最后一个斜杠后的内容)和目录名称(最后一个斜杠前的内容),同时调用基本名称与目录名称形成元组:
os.path.basename(path)
os.path.dirname(path)
os.path.split()
例如:
path = 'c:\\Windows\\System32\\calc.exe'
os.path.basename(path)
os.path.dirname(path)
os.path.split(path)
结果显示为:'calc.exe','c:\Windows\System32',('c:\Windows\System32', 'calc.exe')
- 查看文件大小和文件夹内容
查看文件的字节数:
os.path.getsize(path)
返回包含参数中每个文件的文件名字符串列表:
os.listdir(path)
注意:该函数在os模块而不是os.path模块。
例如:
os.path.getsize('C:\\daka\\machine-learning-Li\\NTU-Machine-learning\\NTU-Machine-learning\\homework\\HW0')
os.listdir('C:\\daka\\machine-learning-Li\\NTU-Machine-learning\\NTU-Machine-learning\\homework\\HW0')
结果显示为:0,
['01-Data', '02-Output', 'Q1.py', 'Q2.py', 'README.md']
- 检查路径有效性
判断文件或文件夹是否存在
判断是否是一个文件
判断是否是一个文件夹
os.path.exists(path)
os.path.isfile(path)
os.path.isdir(path)
- 文件读写(纯文本文件,如txt,p等)
基本三个步骤:
1. 调用open()函数,打开文件返回一个File对象;
2. 调用File对象的read()或write()方法,读取或写入文件;
3. 调用File对象的close()方法,关闭该文件
注意必须有第三步,下一次才能再打开该文件。
open()默认是只读方法,如果想写入需要在open()方法内传入参数,'w'将写入内容覆盖原内容,'a'在原有内容末尾追加写入内容若open的文件不存在,'w'和'a'都会创建一个新的空文件。在写入时write()方法不会自动换行,需要自己添加换行符'\n'。
例如:
baconFile = open('bacon.txt','w')
baconFile.write('Hello World!\n')
baconFile.close()
baconFile = open('bacon.txt','a')
baconFile.write('Bacon is not a vegetable.')
baconFile.close()
baconFile = open('bacon.txt')
content = baconFile.read()
baconFile.close()
print(content)
- Numpy 模块也可以读取存储文件将数据加载到Numpy数组中
np.loadtxt()
np.savetxt()
np.genfromtxt() #面向结构化数组和缺失数据处理。
- 排序
Numpy数组可以通过sort就地排序,np.sort()返回的是排序副本。
练习题编程
我的答案:
import numpy as np
matrixA = np.loadtxt('..\\01-Data\\matrixA.txt',delimiter=',').reshape(1,50)
matrixB = np.loadtxt('..\\01-Data\\matrixB.txt',delimiter=',')
result_matrix = np.dot(matrixA,matrixB)
result_matrix.sort()
# print(result_matrix)
np.savetxt("..\\01-Data\\resultQ1.txt", result_matrix, fmt = "%d",delimiter="\r\n")
给出的答案:
import numpy as np
matrixA = []
for i in open('..\\01-Data\\matrixA.txt'):
row = [int(x) for x in i.split(",")]
matrixA.append(row)
matrixB = []
for j in open('..\\01-Data\\matrixB.txt'):
row = [int(x) for x in j.split(",")]
matrixB.append(row)
matrixA = np.array(matrixA)
matrixB = np.array(matrixB)
ans = matrixA.dot(matrixB)
ans.sort(axis=1)
np.savetxt("..\\01-Data\\Q1_ans.txt", ans, fmt="%d", delimiter="\r\n")
问题2的解决
使用pillow操作图像
- 引入pillow的方法
from PIL import Image
- 打开,保存图片
Image.open()
Image.save()
- 旋转图片
Image.rotate()
4.练习题2代码
from PIL import Image
from PIL import ImageChops
import os
os.chdir('C:\\daka\\machine-learning-Li\\NTU-Machine-learning\\NTU-Machine-learning\\homework\\HW0\\01-Data')
image1 = Image.open('lena.png')
# image1.rotate(180).save('lena_reverse.png')
image2 = Image.open('lena_modified.png')
new_image = ImageChops.difference(image1,image2)
new_image.show()
new_image.save('result_image.png')
给出的答案:
from PIL import Image
lena = Image.open("lena.png")
lena_modified = Image.open("lena_modified.png")
w, h = lena.size
for j in range(h):
for i in range(w):
if lena.getpixel((i, j)) == lena_modified.getpixel((i, j)):
lena_modified.putpixel((i, j), 255)
lena_modified.show()
lena_modified.save("ans_two.png")