今天開始把第一次編程練習(xí)了。代碼及運(yùn)行結(jié)果參見HW0-question1+2。
作業(yè)如下:
Question 1 矩陣運(yùn)算
- 讀取 matrixA.txt 和 matrixB.txt 矩陣
- 進(jìn)行矩陣乘法 - matrixA * matrixB酸纲, 將得到的矩陣數(shù)值,由小到大排序後輸出至ans_one.txt <\blockquote>
Question 2 基本圖片資料操作
- 讀取 lena.png 與 lena_modified.png
- 使用後者異於前者的部分產(chǎn)生相同格式的新圖檔 ans_two.png
準(zhǔn)備工作
jupyter昨天配置好了搔啊,想到自己可能更習(xí)慣pycharm寫程序就配置一下憔杨。開始想應(yīng)該比較簡單,setting設(shè)置一下就行淤毛,沒想到出現(xiàn)了 "Environment location diretory is not empty "今缚,當(dāng)時(shí)沒想明白問題在哪里,看到下面有一個(gè) "Existing environment ",設(shè)置到虛擬環(huán)境DeepLearnningWu仍提示非空低淡,突然想到應(yīng)該選到編輯器也就是python版本而不是文件夾姓言,果然里面有兩個(gè)python.exe,選擇了一個(gè)之后環(huán)境配置完成蔗蹋。
編程過程
問題一的解決
知識(shí)儲(chǔ)備
問題一首先要解決的是python文件的讀取何荚,參考書如下,本書chap8猪杭。
[1] <python 編程快速上手——讓繁瑣工作自動(dòng)化>餐塘,Ai Sweigart。
以下為學(xué)習(xí)過程:
- windows下文件路徑用到斜杠 " \ "表示胁孙,因此路徑里面會(huì)出現(xiàn)兩個(gè)到斜杠唠倦,第一個(gè)用來轉(zhuǎn)義称鳞。
- 創(chuàng)建文件名稱的字符串用命令:
import os
os.path.join()
例如:
import os
os.path.join('usr','bin','spam')
輸出結(jié)果為: 'usr\bin\spam'
擴(kuò)展應(yīng)用:將一個(gè)文件名列表中的名稱,添加到文件夾名稱的末尾稠鼻。
myFiles = ['accounts.txt', 'details.csv', 'invite.docx']
for filename in myFiles:
print(os.path.join('c:\\Users\\asweigart', filename))
顯示結(jié)果:
c:\Users\asweigart\accounts.txt
c:\Users\asweigart\details.csv
c:\Users\asweigart\invite.docx
- 顯示當(dāng)前工作目錄:
os.getcwd()
改變當(dāng)前工作目錄:
os.chdir()
例子:
os.getcwd()
os.chdir('C:\\daka\\machine-learning-Li\\NTU-Machine-learning\\NTU-Machine-learning\\homework\\HW0')
os.getcwd()
顯示結(jié)果: 'C:\Users\Jianyu';
'C:\daka\machine-learning-Li\NTU-Machine-learning\NTU-Machine-learning\homework\HW0'
若要更改的當(dāng)前工作目錄不存在冈止,python會(huì)報(bào)錯(cuò)。
- 絕對路徑與相對路徑
絕對路徑:從根文件開始的完整路徑候齿。
相對路徑:從當(dāng)前工作路徑開始熙暴。
路徑中可使用的特殊名稱:
'.' :'這個(gè)目錄'的縮寫;
'..' : 父文件夾。 - 創(chuàng)建新文件夾
命令:
os.makedirs('文件夾的路徑和名稱')
- python處理文件慌盯、文件夾周霉、文件路徑的模塊
os.path模塊 - 處理絕對路徑和相對路徑
返回參數(shù)的絕對路徑的字符串:
os.path.abspath(path)
例如:
os.path.abspath('.')
顯示結(jié)果為:'C:\daka\machine-learning-Li\NTU-Machine-learning\NTU-Machine-learning\homework\HW0'(參見之前工作路徑的設(shè)置,一致)
判斷參數(shù)是否是絕對路徑:
os.path.isabs()
例如:
os.path.abspath('..')
os.path.isabs('.')
os.path.isabs(os.path.abspath('.'))
顯示結(jié)果為:False亚皂,True
查找第一個(gè)參數(shù)相對第二個(gè)參數(shù)的相對路徑:
os.path.relpath('','')
例如:
os.path.relpath('C:\\daka\\machine-learning-Li','C:\\daka\\machine-learning-Li\\NTU-Machine-learning\\NTU-Machine-learning\\homework\\HW0')
結(jié)果顯示為:'..\..\..\..'
返回參數(shù)的基本名稱(最后一個(gè)斜杠后的內(nèi)容)和目錄名稱(最后一個(gè)斜杠前的內(nèi)容)俱箱,同時(shí)調(diào)用基本名稱與目錄名稱形成元組:
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)
結(jié)果顯示為:'calc.exe','c:\Windows\System32'灭必,('c:\Windows\System32', 'calc.exe')
- 查看文件大小和文件夾內(nèi)容
查看文件的字節(jié)數(shù):
os.path.getsize(path)
返回包含參數(shù)中每個(gè)文件的文件名字符串列表:
os.listdir(path)
注意:該函數(shù)在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')
結(jié)果顯示為:0,
['01-Data', '02-Output', 'Q1.py', 'Q2.py', 'README.md']
- 檢查路徑有效性
判斷文件或文件夾是否存在
判斷是否是一個(gè)文件
判斷是否是一個(gè)文件夾
os.path.exists(path)
os.path.isfile(path)
os.path.isdir(path)
- 文件讀寫(純文本文件禁漓,如txt跟衅,p等)
基本三個(gè)步驟:
1. 調(diào)用open()函數(shù),打開文件返回一個(gè)File對象播歼;
2. 調(diào)用File對象的read()或write()方法伶跷,讀取或?qū)懭胛募?br> 3. 調(diào)用File對象的close()方法,關(guān)閉該文件
注意必須有第三步秘狞,下一次才能再打開該文件叭莫。
open()默認(rèn)是只讀方法,如果想寫入需要在open()方法內(nèi)傳入?yún)?shù)谒撼,'w'將寫入內(nèi)容覆蓋原內(nèi)容食寡,'a'在原有內(nèi)容末尾追加寫入內(nèi)容若open的文件不存在,'w'和'a'都會(huì)創(chuàng)建一個(gè)新的空文件廓潜。在寫入時(shí)write()方法不會(huì)自動(dòng)換行,需要自己添加換行符'\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 模塊也可以讀取存儲(chǔ)文件將數(shù)據(jù)加載到Numpy數(shù)組中
np.loadtxt()
np.savetxt()
np.genfromtxt() #面向結(jié)構(gòu)化數(shù)組和缺失數(shù)據(jù)處理辩蛋。
- 排序
Numpy數(shù)組可以通過sort就地排序,np.sort()返回的是排序副本移盆。
練習(xí)題編程
我的答案:
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()
- 旋轉(zhuǎn)圖片
Image.rotate()
4.練習(xí)題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")