Python 數(shù)據(jù)類型
在 Python 中有許多數(shù)據(jù)類型。最常見的是float(浮點型)隅肥,int(整型),str(字符串)袄简,bool(布爾)腥放,list 和 dict(字典)。
- float - 用于表示實數(shù)绿语。
- int - 用于表示整數(shù)秃症。
- str - 表示文本÷来猓可以使用單引號
'value'
种柑、雙引號“value”
或三引號"""value"""
來定義字符串。三引號字符串可以用在多行文本上匹耕,還可以用于注釋聚请。 - bool - 用于布爾值。
- list - 用于存儲值的集合稳其。
- dict - 用于存儲鍵值對驶赏。
可以用 type(variable_name)
函數(shù)來檢查特定變量的類型。 Python 中的運算符根據(jù)變量的類型而表現(xiàn)不同欢际,每個運算符都有不同的內(nèi)置方法。
下面是在 Python 中創(chuàng)建浮點數(shù)矾兜、整數(shù)损趋、字符串和布爾值變量的例子。
year_of_birth = 1994
height_cm = 170.50
subject = "Data Science"
is_success = True
print(type(year_of_birth), type(height_cm), type(subject), type(is_success))
# 輸出: <class 'int'> <class 'float'> <class 'str'> <class 'bool'>
Python 列表
Python 列表是一種基本的序列類型椅寺。我們可以使用此類型來存儲值的集合浑槽。一個列表可以包含任何類型的值,同時一個列表也可以包含另一個列表進行嵌套返帕。你也可以創(chuàng)建一個混合使用 Python 類型的列表桐玻,不過這并不常用【S可以使用如下方法創(chuàng)建一個列表:
fruits = ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
列表子集
可以用索引從列表中獲取單個或多個元素镊靴。在Python中铣卡,索引從 0
開始。因此偏竟,列表中的第一個元素對應(yīng)索引 0
煮落。我們還可以使用負索引來訪問元素,列表中的最后一個元素的索引為 -1
敦捧,倒數(shù)第二個元素的索引是 -2
瞬浓,依此類推洼裤。我們在Python中也有一個名為 切片 的東西,可用于從列表中獲取多個元素轿衔。可以這樣使用: sliceable[start_index:end_index:step]
睦疫。
-
start_index
是切片的起始索引害驹,此索引所在的元素包含在結(jié)果中,默認值為0
笼痛。 -
end_index
是切片的結(jié)束索引裙秋,此索引處的元素不會被包含到結(jié)果當(dāng)中,默認值將是列表的長度
缨伊。此外摘刑,如果step
為負值,則默認值可以是負的列表的長度 - 1
刻坊。如果跳過此步驟枷恕,你會得到從開始索引到結(jié)尾的所有元素。 -
step
是索引增加的數(shù)量谭胚,默認值為1
徐块。如果把step
設(shè)為負值,會從后向前移動灾而。
fruits = ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
fruits[1] # apple
fruits[0] # "pineapple"
fruits[-1] # "kiwi"
fruits[5] # "kiwi"
fruits[-3] # "strawberry"
# List slicing
fruits[::] # ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
fruits[0:2] # ["pineapple", "apple"]
fruits[-2:-1] # ["orange"]
fruits[3:] # ["strawberry", "orange", "kiwi"]
fruits[:4] # ["pineapple", "apple", "lemon", "strawberry"]
fruits[:] # ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
fruits[::-1] # ["kiwi", "orange", "strawberry", "lemon", "apple", "pineapple"]
fruits[::-2] # ["kiwi", "strawberry", "apple"]
fruits[::2] # ["pineapple", "lemon", "orange"]
# Understanding some default values
fruits[0:6:1] # 與fruits[::]的結(jié)果相同
fruits[-1:-7:-1] # 與fruits[::-1]的結(jié)果相同
操作列表
- 可以用
append
方法或+
(加法運算符)將單個或多個元素添加到列表當(dāng)中胡控。如果你對兩個列表使用加法運算符,Python 將給出兩個列表合并后的新列表旁趟。 - 可以用方括號來修改列表中的單個或多個元素昼激。
- 可以用
remove(value)
方法從列表中刪除一個元素。此方法用參數(shù)傳入的值刪除列表中存儲的第一個相同元素锡搜。
# 添加一個元素
fruits.append("peach")
fruits
#輸出 ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi", "peach"]
fruits = fruits + ["fig", "melon"]
fruits
#輸出 ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"]
# 修改
fruits[0:2] = ["grape", "mango"]
fruits
#輸出 ["grape", "mango", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"]
# 從列表中刪除
fruits.remove("mango")
fruits
#輸出 ["grape", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"]
了解列表背后的工作機制非常重要橙困。當(dāng)創(chuàng)建新列表 my_list
時,列表會存儲在計算機內(nèi)存中耕餐,該列表的地址被存儲在 my_list
變量中凡傅。變量 my_list
不包含列表中的元素,它只包含對列表的引用肠缔。如果我們用等號去復(fù)制一個列表時夏跷,比如 my_list_copy = my_list
哼转,你復(fù)制的只是列表的引用而不是列表的值。所以如果要復(fù)制列表實際的值拓春,可以用 list(my_list)
函數(shù)或切片 [ : ]
释簿。
numbers = [10, 42, 28, 420]
numbers_copy = numbers
numbers_copy[2] = 100
numbers # [10, 42, 100, 420]
numbers_copy # [10, 42, 100, 420]
ratings = [4.5, 5.0, 3.5, 4.75, 4.00]
ratings_copy = ratings[:]
ratings_copy[0] = 2.0
ratings # [4.5, 5.0, 3.5, 4.75, 4.0]
ratings_copy # [2.0, 5.0, 3.5, 4.75, 4.0]
characters = ["A", "B", "C"]
characters_copy = list(characters)
characters_copy[-1] = "D"
characters # ["A", "B", "C"]
characters_copy # ["A", "B", "D"]
Python字典
字典用于存儲鍵值對形式的數(shù)據(jù)。當(dāng)你希望通過唯一鍵對值進行索引時很有用硼莽。在 Python 中庶溶,可以使用花括號創(chuàng)建字典,鍵和值由冒號分隔懂鸵。如果想獲得給定鍵的值偏螺,可以這樣做:our_dict[key]
。
字典與列表
讓我們看一個例子匆光,比較一下列表和詞典套像。假如有一些電影,我們想存儲它們的評級终息,另外還希望通過電影名稱來非扯峁快速地訪問電影的評級。這時可以用兩個列表或一個字典來完成這類操作周崭。在例子中柳譬,movies.index(“Ex Machina”)
代碼返回電影 “Ex Machina” 的索引。
使用列表
movies = ["Ex Machina", "Mad Max: Fury Road", "1408"]
ratings = [7.7, 8.1, 6.8]
movie_choice_index = movies.index("Ex Machina")
print(ratings[movie_choice_index]) # 7.7
使用字典
ratings = {
"Ex Machina": 7.7,
"Mad Max: Fury Road": 8.1,
"1408" : 6.8
}
print(ratings["Ex Machina"]) # 7.7
可以看出续镇,使用字典更加直觀和方便美澳。
操作字典
可以對詞典中的數(shù)據(jù)進行添加,更新和刪除操作摸航。當(dāng)添加或更新數(shù)據(jù)時制跟,可以簡單地使用 our_dict[key] = value
,想要刪除一個鍵值對時酱虎,可以用 del(our_dict[key])
操作雨膨。
ratings["Deadpool"] = 8.0
print(ratings)
# {'Ex Machina': 7.7, 'Mad Max: Fury Road': 8.1, '1408': 6.8, 'Deadpool': 8.0}
ratings["Ex Machina"] = 7.8
print(ratings)
# {'Ex Machina': 7.8, 'Mad Max: Fury Road': 8.1, '1408': 6.8, 'Deadpool': 8.0}
del(ratings["1408"])
print(ratings)
# {'Ex Machina': 7.8, 'Mad Max: Fury Road': 8.1, 'Deadpool': 8.0}
還可以檢查給定的鍵是否在字典中:key in our_dict
。
print("Ex Machina" in ratings) # True
函數(shù)
函數(shù)是解決特定問題的可重用代碼读串×募牵可以用 def
關(guān)鍵字編寫函數(shù):
def is_prime(n):
if n <= 1:
return False
elif n <= 3:
return True
elif n % 2 == 0 or n % 3 == 0:
return False
current_number = 5
while current_number * current_number <= n:
if n % current_number == 0 or n % (current_number + 2) == 0:
return False
current_number = current_number + 6
return True
不過 Python 中有許多內(nèi)置函數(shù),例如 max( iterable[爹土,key] )
甥雕,min( iterable [踩身,key] )
胀茵,type( object )
,round( number[挟阻,ndigits] )
等琼娘。所以當(dāng)我們需要一個解決某個問題的函數(shù)時峭弟,可以先研究一下是否存在相關(guān)的內(nèi)置函數(shù)或 Python 包。沒有必要去“重新發(fā)明輪子”脱拼。
方法
我們已經(jīng)知道 Python 中有字符串瞒瘸,浮點數(shù),整數(shù)熄浓,布爾值等類型情臭。這些數(shù)據(jù)結(jié)構(gòu)都是一個對象。方法是一種可用于給定對象的函數(shù)赌蔑,具體取決于對象的類型俯在。所以每個對象都有一個特定的類型和一組方法,具體形式取決于給出的類型娃惯。
# 字符串方法
text = "Data Science"
text.upper() # "DATA SCIENCE"
text.lower() # "data science"
text.capitalize() # "Data science"
# 列表方法
numbers = [1, 4, 0, 2, 9, 9, 10]
numbers.reverse()
print(numbers) # [10, 9, 9, 2, 0, 4, 1]
numbers.sort()
print(numbers) # [0, 1, 2, 4, 9, 9, 10]
# 字典方法
ratings = {
"Ex Machina": 7.7,
"Mad Max: Fury Road": 8.1,
"1408" : 6.8
}
print(ratings.keys()) # dict_keys(['Ex Machina', 'Mad Max: Fury Road', '1408'])
print(ratings.values()) # dict_values([7.7, 8.1, 6.8])
print(ratings.items()) # dict_items([('Ex Machina', 7.7), ('Mad Max: Fury Road', 8.1), ('1408', 6.8)])
不同類型的對象可以有相同名稱的方法跷乐。根據(jù)對象的類型,方法有各自不同的行為趾浅。
numbers = [10, 30, 55, 40, 8, 30]
text = "Data Science"
numbers.index(8) # 4
text.index("a") # 1
numbers.count(30) # 2
text.count("i") # 1
務(wù)必要小心愕提!某些方法可以更改調(diào)用它們的對象。例如在列表類型上調(diào)用append()
方法時皿哨。
包
模塊是包含 Python 定義和聲明的文件浅侨。用于定義解決特定問題的函數(shù)、方法和新的 Python 類型往史。
包是模塊的集合仗颈。有許多 Python 包涵蓋了不同領(lǐng)域的解決方案。例如椎例,NumPy挨决、matplotlib、seaborn 和 scikit-learn 是非常著名的數(shù)據(jù)科學(xué)支持包订歪。
- NumPy 用于有效地處理數(shù)組
- matplotlib 和 seaborn 是流行的數(shù)據(jù)可視化庫
- scikit-learn 是一個功能強大的機器學(xué)習(xí)庫
默認情況下脖祈,Python 中有一些內(nèi)置包,但是我們還需要更多的包刷晋,這些默認是不安裝的盖高。如果想要使用某個軟件包,它就必須是已經(jīng)安裝好的眼虱,或者先用 pip 安裝( Python的包管理系統(tǒng) )喻奥。
另外,還有一種叫做Anaconda 的東西捏悬。
Anaconda Distribution 是一個免費撞蚕,易于安裝的包管理器、環(huán)境管理器和 Python 發(fā)行版过牙,其中包含1,000多個開源軟件包甥厦,并提供免費的社區(qū)支持纺铭。
所以如果你不想安裝太多的包,我建議你用 Anaconda刀疙。這個發(fā)行版中有很多有用的包舶赔。
導(dǎo)入聲明
安裝所需的包后,可以把它們導(dǎo)入 Python 代碼文件谦秧【鼓桑可以從中導(dǎo)入整個包、子模塊或特定函數(shù)疚鲤。另外還可以為包設(shè)置別名蚁袭。可以從下面的例子中看到 import 語句的不同方式石咬。
簡單的導(dǎo)入
import numpy
numbers = numpy.array([3, 4, 20, 15, 7, 19, 0])
導(dǎo)入的同時設(shè)置別名
import numpy as np # np 是 numpy 包的別名
numbers = np.array([3, 4, 20, 15, 7, 19, 0]) # 工作正常
numbers = numpy.array([3, 4, 20, 15, 7, 19, 0]) # 出錯揩悄,NameError: name 'numpy' is not defined
從包導(dǎo)入子模塊并設(shè)置別名
# 從 matplotlib 包中導(dǎo)入 pyplot 子模塊并設(shè)置別名 "plt"
import matplotlib.pyplot as plt
僅從包中導(dǎo)入一個函數(shù)
from numpy import array
numbers = array([3, 4, 20, 15, 7, 19, 0]) # 工作正常
numbers = numpy.array([3, 4, 20, 15, 7, 19, 0]) # 出錯,NameError: name 'numpy' is not defined
type(numbers) # 輸出:numpy.ndarray
我們也可以這樣導(dǎo)入: from numpy import *
鬼悠。星號表示從該模塊導(dǎo)入所有內(nèi)容删性。這條 import 語句會在當(dāng)前命名空間中為 numpy
模塊定義的所有公共對象創(chuàng)建引用。換句話說焕窝,我們可以使用 numpy
中的所有可用函數(shù)蹬挺,在函數(shù)名稱可以不帶前綴。例如它掂,現(xiàn)在我們可以這樣使用 NumPy 的絕對值函數(shù): absolute()
巴帮,而不是numpy.absolute()
。
但是虐秋,我不建議你使用它榕茧,因為:
- 如果從某些模塊中導(dǎo)入所有函數(shù),那么當(dāng)前的命名空間將填充過多的函數(shù)客给,如果有人查看我們的代碼的話用押,他可能會對某個函數(shù)到底屬于哪個包而感到困惑。
- 如果兩個模塊具有相同名稱的函數(shù)靶剑,則第二個導(dǎo)入的將會覆蓋第一個模塊的函數(shù)蜻拨。
NumPy
NumPy 是用 Python 進行科學(xué)計算的基礎(chǔ)包。它非匙快速且易于使用缎讼。這個包能夠幫助我們按元素進行計算(逐個元素)。
常規(guī)的 Python 列表不知道如何以元素方式進行操作坑匠。當(dāng)然我們也可以用 Python 列表去做科學(xué)計算血崭,但是它非常慢,而且還需要編寫更多的代碼來得到想要的結(jié)果。更多時候使用 NumPy 才是一個聰明的主意功氨。
與常規(guī) Python 列表不同,NumPy 數(shù)組中的元素總是只有一種類型手幢。如果我們將一個不同類型的數(shù)組傳遞給np.array()
捷凄,可以用參數(shù) dtype
設(shè)定想要的類型。如果沒有給出此參數(shù)围来,則會將類型確定為保存對象所需的最小類型跺涤。
NumPy 數(shù)組 —— 類型轉(zhuǎn)換
np.array([False, 42, "Data Science"]) # array(["False", "42", "Data Science"], dtype="<U12")
np.array([False, 42], dtype = int) # array([ 0, 42])
np.array([False, 42, 53.99], dtype = float) # array([ 0. , 42. , 53.99])
# 無效的類型轉(zhuǎn)換
np.array([False, 42, "Data Science"], dtype = float) # 不會把字符串 'Data Science' 轉(zhuǎn)化為浮點型
NumPy 數(shù)組有自己的屬性和方法。你是不是還記得前面說過 Python 運算符在不同的數(shù)據(jù)類型上表現(xiàn)也不一樣监透?在NumPy 中運算符在這方面表現(xiàn)得很好桶错。
NumPy 數(shù)組上的運算符
np.array([37, 48, 50]) + 1 # array([38, 49, 51])
np.array([20, 30, 40]) * 2 # array([40, 60, 80])
np.array([42, 10, 60]) / 2 # array([ 21., 5., 30.])
np.array([1, 2, 3]) * np.array([10, 20, 30]) # array([10, 40, 90])
np.array([1, 2, 3]) - np.array([10, 20, 30]) # array([ -9, -18, -27])
如果檢查 NumPy 數(shù)組的類型,結(jié)果會是 numpy.ndarray
胀蛮。 ndarray 意味著是 n 維數(shù)組院刁。在前面的例子中用了一維數(shù)組,但是也可以使用 2, 3, 4 甚至更多維數(shù)組粪狼。我們可以在數(shù)組上進行子集化退腥,而這與該數(shù)組的維數(shù)無關(guān)。下面是一些二維數(shù)組的例子再榄。
二維數(shù)組的子集
numbers = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]
])
numbers[2, 1] # 8
numbers[-1, 0] # 10
numbers[0] # array([1, 2, 3])
numbers[:, 0] # array([ 1, 4, 7, 10])
numbers[0:3, 2] # array([3, 6, 9])
numbers[1:3, 1:3] # array([[5, 6],[8, 9]])
如果想要知道一個 numpy 數(shù)組有多少個維度狡刘,以及每個維度有多少個元素,可以用 shape
屬性困鸥。下面的代碼得到二維數(shù)組的shape嗅蔬,返回的元組中的第一個元素是行數(shù),第二個元素是列數(shù)疾就。
NumPy 的 shape
屬性
numbers = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
[13, 14, 15]
])
numbers.shape # (5, 3)
基本統(tǒng)計
分析數(shù)據(jù)的第一步是熟悉數(shù)據(jù)澜术。 NumPy 有一些基本方法來幫助我們做到這一點。
-
np.mean()
- 返回算術(shù)平均值(元素之和除以元素的個數(shù))猬腰。 -
np.median()
- 返回中位數(shù)(傳入的數(shù)組的中間值瘪板,如果數(shù)組的長度是偶數(shù),將計算兩個中間值的平均值) -
np.corrcoef()
- 返回一個相關(guān)矩陣漆诽。當(dāng)我們想要查看數(shù)據(jù)集中兩個變量之間是否存在相關(guān)性時侮攀,或者在兩個具有相同長度的數(shù)組之間存在相關(guān)性時,這個函數(shù)非常有用厢拭。 -
np.std()
- 返回標(biāo)準(zhǔn)偏差
learning_hours = [1, 2, 6, 4, 10]
grades = [3, 4, 6, 5, 6]
np.mean(learning_hours) # 4.6
np.median(learning_hours) # 4.0
np.std(learning_hours) # 3.2
np.corrcoef(learning_hours, grades)
# 輸出:[[ 1. 0.88964891][ 0.88964891 1. ]]
使用 NumPy 生成基本統(tǒng)計信息
從上面的例子中兰英,我們可以看到學(xué)習(xí)時間和成績之間存在高度相關(guān)性。
此外還可以看到:
- 學(xué)習(xí)時間的平均值是 4.6
- 學(xué)習(xí)時間的中位數(shù)為 4.0
- 學(xué)習(xí)時間的標(biāo)準(zhǔn)差為 3.2
NumPy 還有一些基本函數(shù)供鸠,如 np.sort()
和 np.sum()
畦贸,在基本的 Python 列表中也有同樣的函數(shù)。不過需要注意的是 NumPy 在數(shù)組中會強制統(tǒng)一類型,這加快了計算速度薄坏。