- Python數據分析與挖掘
- 齊福利 楊玲主編
- 2764字
- 2024-03-14 11:21:31
1.1 NumPy數組的創建與保存
創建NumPy數組一般有以下3種方法。
● 通過傳入可迭代對象創建,這是基本方法。
● 使用NumPy內部功能函數創建,這是一種通用方法。
● 讀取外部數據創建。
1.1.1 使用基本方法創建數組
基本方法是對已知可迭代對象創建ndarray數組,即通過在NumPy提供的array()方法中傳入可迭代對象來創建數組。這種方法通常是在已知所有元素的情況下使用的。
基本方法的實現格式:np.array([可迭代對象])。
那什么是可迭代對象?Python可以對列表、元組、字典、字符串等類型的數據使用for...in...循環語法,從其中依次讀取數據,我們把這樣的過程稱為遍歷,也叫迭代。所以,我們把能夠通過for...in...這類語句迭代讀取一條條數據供用戶使用的對象稱為可迭代對象。
在NumPy中創建數組的基本方法如下。
【動動手練習1-1】 使用基本方法創建數組
>>>import numpy as np >>> np.array([0, 1, 2, 3, 4]) #接收一個列表作為參數 array([0, 1, 2, 3, 4]) >>> np.array([[11, 12, 13],[21, 22, 23]]) #創建一個2*3的二維數組 array([[11, 12, 13], [21, 22, 23]]) >>> np.array([[[1,2,3],[1,2,0]],[[5,6,7],[9,8,7]]]) #創建一個 2*2*3 的三維數組,可以將其理解為由兩個或更多個二維數組組成三維數組。同樣地,四維數組可以被理解為由兩個或更多 個三維數組生成 array([[[1, 2, 3], [1, 2, 0]], [[5, 6, 7], [9, 8, 7]]]) >>> np.array((0, 1, 2, 3, 4)) #接收一個元組作為參數 array([0, 1, 2, 3, 4]) #np.array()方法可以在創建數組的同時指定數據類型 >>> np.array([0, 1, 2, 3, 4], dtype=float) #注意數據類型使用dtype定義 array([0., 1., 2., 3., 4.]) #還可以將創建整數列表的range()函數返回的可迭代對象作為參數 >>> np.array(range(5)) array([0, 1, 2, 3, 4]) >>> np.array(range(10, 20, 2)) array([10, 12, 14, 16, 18]) >>>type(np.array(range(5))) #查看變量類型 numpy.ndarray
ndarray是同一個數據類型的數組,后面會有更詳細的介紹。實現以下語句,查看返回的ndarray各元素的值。
np.array([0, 1, 2, 3, 4], dtype=str) np.array([0, 1, 2, 3, 4], dtype=bool)
1.1.2 使用通用方法創建數組
通用方法指的是由NumPy提供的np.arange()、np.linspace()、np.ones()、np.zeros()、np.eye()、np.full()、np.random.random()、np.random.randint()方法直接生成數組。這些方法可以按照某種規則生成一個數組,并不需要傳入已知的可迭代對象。
【動動手練習1-2】 使用通用方法創建數組
(1)np.arange()方法。
前面我們將range()函數的結果傳遞給np.array(),是對已知可迭代對象創建ndarray數組,這和NumPy中的np.arange()方法實現的功能是一樣的。np.arange()方法是直接生成數組,可以說np.arange()方法就是NumPy中的range()方法。
>>> np.arange(5) array([0, 1, 2, 3, 4]) >>> np.arange(10, 20, 2) array([10, 12, 14, 16, 18])
(2)np.linspace()方法。
np.linspace()方法以等間距的形式劃分給定的數來創建數組。
>>> np.linspace(10, 20, 5) #將10~20的數等距取5個 array([10. , 12.5, 15. , 17.5, 20. ])
(3)np.ones()方法。
np.ones()方法用于創建一個元素值全為1的數組,接收一個列表或者元組作為參數,這些參數決定創建數組的維數。
>>> np.ones([2]) #創建一個一維數組 array([1., 1.]) >>> np.ones([2, 2]) #創建一個二維數組 array([[1., 1.], [1., 1.]]) >>>np.ones([2, 3, 3],dtype=int) #創建一個三維數組,該數組由2個3*3的二維數組組成 array([[[1, 1, 1], [1, 1, 1], [1, 1, 1]], [[1, 1, 1], [1, 1, 1], [1, 1, 1]]])
(4)np.zeros()方法。
np.zeros()方法用于創建一個元素值全為0的數組,接收一個列表或者元組作為參數。
>>> np.zeros([3]) #創建一個一維數組,參數是一個列表[3] array([0., 0., 0.]) >>> np.zeros((3, 3)) #創建一個二維數組,參數是一個元組(3, 3) array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])
(5)np.eye()方法。
np.eye()方法用于創建一個從左上角到右下角的對角線上的元素值全為1,其余元素值全為0的數組(單位矩陣)。注意,np.eye()方法的參數可不再是列表或者元組了。
>>> np.eye(3, 3) #注意np.eye()方法與np.zeros()、np.ones()方法參數的區別,np.eye()方法的參數是兩個數值 array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) >>> np.eye(2, 3) array([[1., 0., 0.], [0., 1., 0.]])
可以將對稱的矩陣(如上面的np.eye(3, 3))簡寫為np.eye(3),其結果是相同的。
當然,以上生成數組的數值類型默認是浮點型,如果設置為其他數值類型可使用dtype定義。
(6)np.full()方法。
np.full()方法可以創建一個填充給定數值的數組。數組由兩個參數組成:第1個參數是定義數組形狀的列表或元組,第2個參數是需要填充的數值。
>>> np.full((2, 3), 3) #創建一個2*3的數組,所有元素都填充3 array([[3, 3, 3], [3, 3, 3]])
(7)np.random.random()方法。
np.random.random()方法用于創建一個元素值為0~1的隨機數數組,接收一個列表或者元組作為參數。
>>> np.random.random((3, 3)) #創建一個3行3列的二維數組 array([[0.19414645, 0.2306415 , 0.08072019], #數組元素是隨機產生的 [0.68814308, 0.48019088, 0.61438206], [0.5361477 , 0.33779769, 0.38549407]])
(8)np.random.randint()方法。
既然有np.random.random()方法,就會有np.random.randint()方法,也就是取隨機整數的方法。不過這個np.random.randint()方法參數的形式與Python的random.random()不太一樣,具體請看下面的實例。
>>>import random >>>random.random() #取0~1的隨機數 0.4481402883460749 >>>random.randint(10,20) #取10~20的隨機整數 15 #注意np.random.randint()方法與Python的random.random()方法的異同 >>> np.random.randint(1, 10, 3) #從1~10中隨機取3個整數創建一維數組 array([6, 4, 6]) >>> np.random.randint(1, 10,(2,3)) #創建2行3列的二維數組,參數(2,3)是數組形狀 array([[7, 4, 3], [9, 1, 6]])
數組形狀就是數組的維數。事實上,比較np.random.randint()方法與Python的random.random()方法,我們就會發現,Python的random.random()方法主要是實現一個隨機數,而np.random.randint()方法是一次生成一個數組的隨機數,并且可以定義不同的數組形狀。
1.1.3 讀取外部數據創建數組
數據分析離不開對數據的獲取,NumPy也支持從外部讀取數據來創建數組,例如從硬盤中讀取CSV、TXT等文本文件來創建數組。np.loadtxt()是NumPy中讀取文件的一個方法(NumPy還有其他讀文件的方法,本書只介紹該方法),其一般用法:np.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0,usecols=None, unpack=False)。
各參數說明如下。
● fname:要讀取的文件、文件名或生成器。
● dtype:數據類型,默認為浮點型。
● comments:注釋,默認是#。
● delimiter:分隔符,默認是空格。
● converters:轉換器,可以對讀入的數據設置轉換操作,一般與轉換函數配合使用。
● skiprows:跳過前幾行讀取,默認是0,必須是整型。
● usecols:要讀取哪些列,0是第1列。例如,usecols = (1,4,5)將提取第2、5和6列。默認讀取所有列。
● unpack:如果為True,將分列讀取,有多少列就返回多少個向量數組;如果為默認的False,則分行讀取,將讀取的列合并為一個向量元素。
上面給出了np.loadtxt()方法所有的關鍵字參數,下面我們只對感興趣的參數給出示例。
【動動手練習1-3】 讀取外部數據創建NumPy數組
在d盤的data目錄下創建一個id.csv文件,文件內容如下。(表示路徑的方式有“/”和“\\”兩種,本書統一采用“\\”)
id,height,length 1,100,101 2,200,230 3,300,350
通過NumPy讀取數據。
>>> np.loadtxt('d:\\data\\id.csv',delimiter=',',skiprows=1) #也可以寫成 #np.loadtxt(fname='d:\\data\\id.csv',delimiter=',',skiprows=1) array([[ 1., 100., 101.], #按行輸出 [ 2., 200., 230.], [ 3., 300., 350.]]) >>>np.loadtxt('d:\\data\\id.csv',delimiter=',',skiprows=1,unpack=True)# 增加unpack參數 array([[ 1., 2., 3.], #按列輸出,一列為一維 [100., 200., 300.], [101., 230., 350.]])
第1個參數fname為'd:\\data\\id.csv',是讀取的文件名稱。
第2個參數delimiter是指定讀取文件中數據的分割符。
第3個參數skiprows是選擇跳過的行數。
我們可以比較unpack參數的作用,默認行數據為數組元素。將其值設為True,則按列輸出。
讀取外部數據的方法還有np.genfromtxt()等,在此不再介紹,讀者可自行查閱相關知識學習。
1.1.4 將數組保存為文本文件
np.savetxt()方法需要2個參數:第1個參數是文件名,數據類型為字符串;第2個參數是被寫入文件的數據,數據類型為ndarray對象。
需要說明的是,寫入的ndarray數組元素數據為字符串內容時,寫入會出錯。這是因為NumPy是一個數學計算包,側重數值的處理,只能寫入數值數據。另外,使用NumPy可直接導入數值數據,但讀字符串會出錯,如果必須讀入文本數據,一般會使用轉換器對應的函數將文本轉換為數值。
下面舉例說明使用np.savetxt()方法寫入文本文件。
【例題1-1】 將NumPy數組保存為文件
>>>import numpy as np >>> matrix=np.eye(2).astype('int') #生成對稱矩陣二維數組,并將其值轉換為整數 >>> matrix #查看矩陣數組 array([[1, 0], #顯示結果 [0, 1]]) >>> matrix.dtype #查看矩陣二維數組的數據類型 dtype('int32') #顯示為32位的整數 >>> np.savetxt('d:\\data\\eys.txt',matrix) #使用np.savetxt()方法寫入文本文件
寫入文本文件的結果如圖1-1所示。

圖1-1 使用np.savetxt()方法寫入文本文件的結果
從圖1-1可以看出,ndarray對象中的元素數據類型原本為整型,但寫入文件時轉變為浮點型。同樣,使用np.loadtxt()方法載入數據時,即使原來文本中數據的類型為整型,載入后轉換為ndarray數組的數據類型也會默認變成浮點型,讀者可自行試驗。