1. 《python高級編程(第二版)》epub下載在線閱讀,求百度網盤雲資源
《Python高級編程(第二版)》([波蘭] Michał Jaworski)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:https://pan..com/s/1C_F1jP47b0hFtxCX1---UA
書名:Python高級編程(第二版)
作者:[波蘭] Michał Jaworski
譯者:張亮
豆瓣評分:7.2
出版社:人民郵電出版社
出版年份:2017-9-19
頁數:424
內容簡介:
Python作為一種高級程序設計語言,憑借其簡潔、易讀及可擴展性日漸成為程序設計領域備受推崇的語言之一。
本書基於Python 3.5版本進行講解,通過13章的內容,深度揭示了Python編程的高級技巧。本書從Python語言及其社區的現狀開始介紹,對Python語法、命名規則、Python包的編寫、部署代碼、擴展程序開發、管理代碼、文檔編寫、測試開發、代碼優化、並發編程、設計模式等重要話題進行了全面系統化的講解。
本書適合想要進一步提高自身Python編程技能的讀者閱讀,也適合對Python編程感興趣的讀者參考學習。全書結合典型且實用的開發案例,可以幫助讀者創建高性能的、可靠且可維護的Python應用。
作者簡介:
Michał Jaworski有著7年Python編程的經驗。他還是graceful的創建者,這是一個構建於falcon之上的REST框架。他曾在不同的公司擔任過多種角色,從一名普通的全棧開發人員到軟體架構師再到一家快節奏創業公司的工程副總裁。他目前是Opera軟體公司TV Store(電視應用商店)團隊的首席後端工程師。他在設計高性能的分布式服務方面擁有豐富的經驗。他還是一些流行的Python開源項目的活躍貢獻者。
Tarek Ziadé是Mozilla的工程經理,與一個專門用Python為Firefox構建大規模Web應用的團隊合作。他對Python打包做出過貢獻,而且從早期Zope開始就使用過各種不同的Python Web框架。
Tarek還創建了Afpy——法國的Python用戶組,並且用法語寫過兩本關於Python的書。他還在諸如Solutions Linux、PyCon、OSCON和EuroPython等國際活動中做過多次法語演講和教學。
2. Python實現彩色散點圖繪制(利用色帶對散點圖進行顏色渲染)
接受自己的普通,然後全力以赴的出眾,告訴自己要努力,但不要著急....
當然, 這個結果並不是我真正想要的,Pass, 太丑了!
好吧,安排,我們先看下實現後的效果!
這個效果自然就比之前的好多了!
實現python散點圖繪制需要用到matplotlib庫, matplotlib庫是專門用於可視化繪圖的工具庫;學習一個新的庫當然看官方文檔了: https://www.osgeo.cn/matplotlib/contents.html
實現思路:
matplotlib.pyplot.scatter() 函數是專門繪制散點圖的函數: https://www.osgeo.cn/matplotlib/api/_as_gen/matplotlib.pyplot.scatter.html?highlight=scatter#matplotlib.pyplot.scatter
matplotlib.pyplot.scatter ( x, y , s=None , c=None , marker=None , cmap=None , norm=None , vmin=None , vmax=None , alpha=None , linewidths=None , verts=None , edgecolors=None , ***, data=None , ** kwargs ) **
plt.scatter(observation, estimate, c=Z1, cmap=colormap, marker=".", s=marker_size, norm=colors.LogNorm(vmin=Z1.min(), vmax=0.5 * Z1.max()))
其中:
1、c參數為計算的散點密度;
2、cmap為色帶(matplotlib裡面自帶了很多色帶可供選擇),參見:
https://www.osgeo.cn/matplotlib/gallery/color/colormap_reference.html
3、由於計算的散點密度數值大小分散,因此利用norm參數對散點密度Z1進行歸一化處理(歸一化方式很多,參見colors類),並給歸一化方式設置色帶刻度的最大最小值vmin和vmax(一般這兩個參數就是指定散點密度的最小值和最大值),這樣就建立起了密度與色帶的映射關系。
https://matplotlib.org/tutorials/colors/colormapnorms.html
(這里的結果與前面展示的相比改變了計算散點密度的半徑:radius = 3以及繪制散點圖的散點大小marksize)
作者能力水平有限,歡迎各位批評指正!
3. 求一個PYTHON案例
# 以下程序可能要安裝OpenCV2.0(並編譯好並配置好環境)以及Xvid解碼器才能運行
# _*_coding: cp936_*_
import cv
capture = cv.CreateFileCapture("tmp.avi")
#請確保當前目錄下有tmp.avi文件
fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
totalFrameNumber =cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_COUNT)
frameWidth = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH)
frameHeight = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT)
print fps, totalFrameNumber, frameWidth, frameHeight
frame = cv.QueryFrame(capture)
while frame:
cv.ShowImage('Title', frame)
frame = cv.QueryFrame(capture)
if cv.WaitKey(1000 / fps) == 27:# ESC鍵退出視頻播放
cv.DestroyWindow('Title')
break
一個文件夾整理工具wxPython版本(不清楚軟體用法情況下可以打開該軟體看看界面但請不要使用裡面的功能,後果自負。)
# -*- coding: cp936 -*-
# file:aa.py
import os, shutil, sys
import wx
sourceDir = ''
sourceFiles = ''
preWord = 0
def browse(event):
global sourceDir, textPreWord, textDirName
dialog = wx.DirDialog(None, u'選擇待處理文件夾', style = wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
sourceDir = dialog.GetPath().strip('\"')
textDirName.SetLabel(sourceDir)
dialog.Destroy()
textPreWord.SetFocus()
def okRun(event):
global preWord, sourceDir, sourceFiles, textPreWord
preWord = int(textPreWord.GetValue())
if preWord <= 0:
wx.MessageBox(u'請正確輸入前綴字元個數!', u'出錯啦', style = wx.ICON_ERROR | wx.OK)
textPreWord.SetFocus()
return
sourceDir = textDirName.GetValue()
sourceFiles = os.listdir(sourceDir)
for currentFile in sourceFiles:
tmp = currentFile
currentFile = sourceDir + '\\' + currentFile
currentFile = currentFile.strip('\"')
if os.path.isdir(currentFile):
continue
targetDir = '%s\\%s'%(sourceDir, tmp[:preWord])
if not os.path.exists(targetDir):
os.mkdir(targetDir)
shutil.move(currentFile, targetDir)
wx.MessageBox(u'任務完成!', u'好消息', style = wx.ICON_ERROR | wx.OK)
def onChange(event):
global dir1, textDirName
p = dir1.GetPath()
textDirName.SetLabel(p)
app = wx.App(0)
win = wx.Frame(None, title = u'文件整理', size = (400, 450))
bg = wx.Panel(win)
btnBrowse = wx.Button(bg, label = u'瀏覽')
btnBrowse.Bind(wx.EVT_BUTTON, browse)
btnRun = wx.Button(bg, label = u'整理')
btnRun.Bind(wx.EVT_BUTTON, okRun)
dir1 = wx.GenericDirCtrl(bg, -1, dir='', style=wx.DIRCTRL_DIR_ONLY)
tree = dir1.GetTreeCtrl()
dir1.Bind(wx.wx.EVT_TREE_SEL_CHANGED, onChange, id = tree.GetId())
textPreWord = wx.TextCtrl(bg)
textDirName = wx.TextCtrl(bg)
textPreWord.SetFocus()
class MyFileDropTarget(wx.FileDropTarget):#聲明釋放到的目標
def __init__(self, window):
wx.FileDropTarget.__init__(self)
self.window = window
def OnDropFiles(self, x, y, filenames):#釋放文件處理函數數據
for name in filenames:
if not os.path.isdir(name):
wx.MessageBox(u'只能選擇文件夾!', '出錯啦', style = wx.ICON_ERROR | wx.OK)
return
self.window.SetValue(name)
dt = MyFileDropTarget(textDirName)
textDirName.SetDropTarget(dt)
hbox0 = wx.BoxSizer()
hbox0.Add(dir1, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
hbox1 = wx.BoxSizer()
hbox1.Add(textDirName, proportion = 1, flag = wx.EXPAND, border = 5)
hbox1.Add(btnBrowse, proportion = 0, flag = wx.LEFT, border = 5)
hbox2 = wx.BoxSizer()
hbox2.Add(textPreWord, proportion = 1, flag = wx.EXPAND, border = 5)
hbox2.Add(btnRun, proportion = 0, flag = wx.LEFT, border = 5)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox0, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
vbox.Add(wx.StaticText(bg, -1, u'\n 選擇待處理文件夾路徑:'))
vbox.Add(hbox1, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
vbox.Add(wx.StaticText(bg, -1, u'\n\n 前綴字元個數:'))
vbox.Add(hbox2, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
vbox.Add(wx.StaticText(bg, -1, u'\n'))
bg.SetSizer(vbox)
win.Center()
win.Show()
app.MainLoop()
#py2exe打包代碼如下:
from distutils.core import setup
import py2exe
setup(windows=["aa.py"])
打包好了之後有18Mb。
一個文件內容批量替換摸查器(wxPython版本):
# _*_ coding:cp936 _*_
from string import join, split
import os
import wx
def getAllFiles(adir):
tmp = []
for parent, dirs, files in os.walk(adir):
for afile in files:
tmp.append(os.path.join(parent, afile))
return tmp
def browse(event):
dialog = wx.DirDialog(None, '選擇待處理文件夾', style=wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
aDir = dialog.GetPath()
textDir.SetLabel(aDir)
dialog.Destroy()
def check():
promp.SetForegroundColour('#FF0000')
promp.SetLabel(' 搜索中...')
listFound.ClearAll()
tmp = []
files = getAllFiles(textDir.GetValue())
for filename in files:
try:
afile = open(filename, 'r')
except IOError:
print '打開文件錯誤。'
continue
try:
content = afile.read().decode('utf-8')
afile.close()
except:
try:
afile = open(filename, 'r')
content = afile.read().decode('cp936')
afile.close()
except:
continue
if textNeedChar.GetValue() in content:
tmp.append(filename)
listFound.InsertStringItem(0, filename)
parentDir.SetForegroundColour('#FF0000')
# parentDir.SetLabel(' 正在搜索:'+filename)
return tmp
def onFind(event):
check()
parentDir.SetLabel(' 搜索結果:')
promp.SetLabel(' 任務完成。')
wx.MessageBox(listFound.GetItemCount() and '任務完成,找到%d個文件。' % listFound.GetItemCount()
or '未找到包含"%s"的文件!' % textNeedChar.GetValue().encode('cp936'), '查找結束',
style=wx.ICON_INFORMATION | wx.OK)
def onReplace(event):
dg = wx.TextEntryDialog(bg, '替換成:', '提示', style=wx.OK | wx.CANCEL)
if dg.ShowModal() != wx.ID_OK:
return
files = check()
userWord = dg.GetValue()
#if not userWord:
#wx.MessageBox('請輸入要替換為何字!', style=wx.ICON_ERROR | wx.OK)
#onReplace(event)
#return
for filename in files:
try:
afile = open(filename, 'r')
except IOError:
print '打開文件錯誤。'
continue
try:
content = afile.read().decode('utf-8')
afile.close()
except:
try:
afile = open(filename, 'r')
content = afile.read().decode('cp936')
afile.close()
except IOError:
print '打開文件錯誤。'
continue
content = content.replace(textNeedChar.GetValue(), userWord)
try:
content = content.encode('utf-8')
except:
pass
open(filename, 'w').write(content)
parentDir.SetLabel(' 替換的文件:')
promp.SetLabel(' 任務完成。')
wx.MessageBox(listFound.GetItemCount() and '任務完成,替換了%d個文件。' % listFound.GetItemCount()
or '未找到包含"%s"的文件!' % textNeedChar.GetValue().encode('cp936'), '替換結束', style=wx.ICON_INFORMATION | wx.OK)
app = wx.App(0)
win = wx.Frame(None, title='文件整理', size=(400, 450))
bg = wx.Panel(win)
btnBrowse = wx.Button(bg, label='瀏覽')
btnBrowse.Bind(wx.EVT_BUTTON, browse)
btnFind = wx.Button(bg, label='查找')
btnFind.Bind(wx.EVT_BUTTON, onFind)
btnFind.SetDefault()
btnReplace = wx.Button(bg, label='替換')
btnReplace.Bind(wx.EVT_BUTTON, onReplace)
textNeedChar = wx.TextCtrl(bg, value='你好')
textDir = wx.TextCtrl(bg, value='E:\Workspace\Python\Python\e')
parentDir = wx.StaticText(bg)
promp = wx.StaticText(bg)
listFound = wx.ListCtrl(bg, style=wx.VERTICAL)
class MyFileDropTarget(wx.FileDropTarget):#聲明釋放到的目標
def __init__(self, window):
wx.FileDropTarget.__init__(self)
self.window = window
def OnDropFiles(self, x, y, filenames):#釋放文件處理函數數據
for name in filenames:
'''if not os.path.isdir(name):
wx.MessageBox('只能選擇文件夾!', '出錯啦', style=wx.ICON_ERROR | wx.OK)
return '''
self.window.SetValue(name)
dt = MyFileDropTarget(textDir)
textDir.SetDropTarget(dt)
hbox1 = wx.BoxSizer()
hbox1.Add(textDir, proportion=1, flag=wx.EXPAND, border=5)
hbox1.Add(btnBrowse, proportion=0, flag=wx.LEFT, border=5)
hbox2 = wx.BoxSizer()
hbox2.Add(textNeedChar, proportion=1, flag=wx.EXPAND, border=5)
hbox2.Add(btnFind, proportion=0, flag=wx.LEFT, border=5)
hbox2.Add(btnReplace, proportion=0, flag=wx.LEFT, border=5)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(wx.StaticText(bg, -1, '\n 選擇待處理文件夾(可拖動文件夾到下面區域中):'))
vbox.Add(hbox1, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(wx.StaticText(bg, -1, '\n\n 要替換 / 查找的文字:'))
vbox.Add(hbox2, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(promp, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(parentDir, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(listFound, proportion=1,
flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT, border=5)
bg.SetSizer(vbox)
win.Center()
win.Show()
app.MainLoop()
4. 《Python寶典》txt下載在線閱讀全文,求百度網盤雲資源
《Python寶典》(楊佩璐/宋強)電子書網盤下載免費在線閱讀
鏈接:
書名:《Python寶典》
作者:楊佩璐/宋強
譯者:
豆瓣評分:
出版社:電子工業出版社
出版年份:2014-5
頁數:504
內容簡介:Python是目前流行的腳本語言之一。《Python寶典》由淺入深、循序漸進地為讀者講解了如何使用Python進行編程開發。《Python寶典》內容共分三篇,分為入門篇、高級篇和案例篇。入門篇包括Python的認識和安裝、開發工具簡介、Python基本語法、數據結構與演算法、多媒體編程、系統應用、圖像處理和GUI編程等內容。高級篇包括用Python操作資料庫、進行Web開發、網路編程、科學計算、多線程編程等內容。案例篇選擇了3個案例演示了Python在Windows系統優化、大數據處理和游戲開發方面的應用。
《Python寶典》針對Python的常用擴展模塊給出了詳細的語法介紹,並且給出了典型案例,通過對《Python寶典》的學習,讀者能夠很快地使用Python進行編程開發。
《Python寶典》適合Python初學者、程序設計人員、編程愛好者、本科及大專院校學生,以及需要進行對科學的計算的工程人員閱讀。
5. 用python語言編寫一個點擊彩色泡泡的小游戲
建議你懸賞500rmb
6. python語言,利用遞歸繪制彩色四階五邊形科赫雪花,並上傳代碼和科赫雪花效果圖
import random
import turtle
def random_color():
rgbl=[255,0,0]
random.shuffle(rgbl)
return tuple(rgbl)
def koch(size,n):
if n==0:
turtle.fd(size)
else:
for angle in [0,60,-120,60]:
cc = random_color()
turtle.pencolor(cc[0], cc[1], cc[2])
turtle.left(angle)
koch(size/3,n-1)
def main():
turtle.colormode(255)
turtle.setup(600,600)
turtle.penup()
turtle.goto(-200,100)
turtle.pendown()
turtle.pensize(2)
level=4 #4階科赫雪花,階數
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
turtle.done()
main()
效果如圖:
7. 121 11 個案例掌握 Python 數據可視化--星際探索
星空是無數人夢寐以求想了解的一個領域,遠古的人們通過肉眼觀察星空,並制定了太陰歷,指導農業發展。隨著現代科技發展,有了更先進的設備進行星空的探索。本實驗獲取了美國國家航空航天局(NASA)官網發布的地外行星數據,研究及可視化了地外行星各參數、尋找到了一顆類地行星並研究了天體參數的相關關系。
輸入並執行魔法命令 %matplotlib inline, 設置全局字型大小,去除圖例邊框,去除右側和頂部坐標軸。
本數據集來自 NASA,行星發現是 NASA 的重要工作之一,本數據集搜集了 NASA 官網發布的 4296 顆行星的數據,本數據集欄位包括:
導入數據並查看前 5 行。
截至 2020 年 10 月 22 日 全球共發現 4296 顆行星,按年聚合並繪制年度行星發現數,並在左上角繪制 NASA 的官方 LOGO 。
從運行結果可以看出,2005 年以前全球行星發現數是非常少的,經計算總計 173 顆,2014 和 2016 是行星發現成果最多的年份,2016 年度發現行星 1505 顆。
對不同機構/項目/計劃進行聚合並降序排列,繪制發現行星數目的前 20 。
2009 年至 2013 年,開普勒太空望遠鏡成為有史以來最成功的系外行星發現者。在一片天空中至少找到了 1030 顆系外行星以及超過 4600 顆疑似行星。當機械故障剝奪了該探測器對於恆星的精確定位功能後,地球上的工程師們於 2014 年對其進行了徹底改造,並以 K2 計劃命名,後者將在更短的時間內搜尋宇宙的另一片區域。
對發現行星的方式進行聚合並降序排列,繪制各種方法發現行星的比例,由於排名靠後的幾種方式發現行星數較少,因此不顯示其標簽。
行星在宇宙中並不會發光,因此無法直接觀察,行星發現的方式多為間接方式。從輸出結果可以看出,發現行星主要有以下 3 種方式,其原理如下:
針對不同的行星質量,繪制比其質量大(或者小)的行星比例,由於行星質量量綱分布跨度較大,因此採用對數坐標。
從輸出結果可以看出,在已發現的行星中,96.25% 行星的質量大於地球。(圖中橫坐標小於 e 的紅色面積非常小)
通過 sns.distplot 介面繪制全部行星的質量分布圖。
從輸出結果可以看出,所有行星質量分布呈雙峰分布,第一個峰在 1.8 左右(此處用了對數單位,表示大約 6 個地球質量),第二個峰在 6.2 左右(大概 493 個地球質量)。
針對不同發現方式發現的行星,繪制各行星的公轉周期和質量的關系。
從輸出結果可以看出:徑向速度(Radial Velocity)方法發現的行星在公轉周期和質量上分布更寬,而凌日(Transit)似乎只能發現公轉周期相對較短的行星,這是因為兩種方法的原理差異造成的。對於公轉周期很長的行星,其運行到恆星和觀察者之間的時間也較長,因此凌日發現此類行星會相對較少。而徑向速度與其說是在發現行星,不如說是在觀察恆星,由於恆星自身發光,因此其觀察機會更多,發現各類行星的可能性更大。
針對不同發現方式發現的行星,繪制各行星的距離和質量的關系。
從輸出結果可以看出,凌日和徑向速度對距離較為敏感,遠距離的行星大多是通過凌日發現的,而近距離的行星大多數通過徑向速度發現的。原因是:近距離的行星其引力對恆星造成的擺動更為明顯,因此更容易觀察;當距離較遠時,引力作用變弱,擺動效應減弱,因此很難藉助此方法觀察到行星。同時,可以觀察到當行星質量更大時,其距離分布相對較寬,這是因為雖然相對恆星的距離變長了,但是由於行星質量的增加,相對引力也同步增加,恆星擺動效應會變得明顯。
將所有行星的質量和半徑對數化處理,繪制其分布並擬合其分布。
由於:
因此,從原理上質量對數與半徑對數應該是線性關系,且斜率為定值 3 ,截距的大小與密度相關。
從輸出結果可以看出:行星質量和行星半徑在對數變換下,具有較好的線性關系。輸出 fix_xy 數值可知,其關系可以擬合出如下公式:
擬合出曲線對應的行星平均密度為:
同樣的方式繪制恆星質量與半徑的關系。
從輸出結果可以看出,恆星與行星的規律不同,其質量與半徑在對數下呈二次曲線關系,其關系符合以下公式:
同樣的方式研究恆星表面重力加速度與半徑的關系。
從輸出結果可以看出,恆星表面對數重力加速度與其對數半徑呈現較好的線性關系:
以上我們分別探索了各變數的分布和部分變數的相關關系,當數據較多時,可以通過 pd.plotting.scatter_matrix 介面,直接繪制各變數的分布和任意兩個變數的散點圖分布,對於數據的初步探索,該介面可以讓我們迅速對數據全貌有較為清晰的認識。
通過行星的半徑和質量,恆星的半徑和質量,以及行星的公轉周期等指標與地球的相似性,尋找諸多行星中最類似地球的行星。
從輸出結果可以看出,在 0.6 附近的位置出現了一個最大的圓圈,那就是我們找到的類地行星 Kepler - 452 b ,讓我們了解一下這顆行星:
數據顯示,Kepler - 452 b 行星公轉周期為 384.84 天,半徑為 1.63 地球半徑,質量為 3.29 地球質量;它的恆星為 Kepler - 452 半徑為太陽的 1.11 倍,質量為 1.04 倍,恆星方面數據與太陽相似度極高。
以下內容來自網路。 開普勒452b(Kepler 452b) ,是美國國家航空航天局(NASA)發現的外行星, 直徑是地球的 1.6 倍,地球相似指數( ESI )為 0.83,距離地球1400光年,位於為天鵝座。
2015 年 7 月 24 日 0:00,美國國家航空航天局 NASA 舉辦媒體電話會議宣稱,他們在天鵝座發現了一顆與地球相似指數達到 0.98 的類地行星開普勒 - 452 b。這個類地行星距離地球 1400 光年,繞著一顆與太陽非常相似的恆星運行。開普勒 452 b 到恆星的距離,跟地球到太陽的距離相同。NASA 稱,由於缺乏關鍵數據,現在不能說 Kepler - 452 b 究竟是不是「另外一個地球」,只能說它是「迄今最接近另外一個地球」的系外行星。
在銀河系經緯度坐標下繪制所有行星,並標記地球和 Kepler - 452 b 行星的位置。
類地行星,是人類寄希望移民的第二故鄉,但即使最近的 Kepler-452 b ,也與地球相聚 1400 光年。
以下通過行星的公轉周期和質量兩個特徵將所有行星聚為兩類,即通過訓練獲得兩個簇心。
定義函數-計算距離
聚類距離採用歐式距離:
定義函數-訓練簇心
訓練簇心的原理是:根據上一次的簇心計算所有點與所有簇心的距離,任一點的分類以其距離最近的簇心確定。依此原理計算出所有點的分類後,對每個分類計算新的簇心。
定義函數預測分類
根據訓練得到的簇心,預測輸入新的數據特徵的分類。
開始訓練
隨機生成一個簇心,並訓練 15 次。
繪制聚類結果
以最後一次訓練得到的簇心為基礎,進行行星的分類,並以等高面的形式繪制各類的邊界。
從運行結果可以看出,所有行星被分成了兩類。並通過上三角和下三角標注了每個類別的簇心位置。
聚類前
以下輸出了聚類前原始數據繪制的圖像。