官术网_书友最值得收藏!

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數組的數據類型也會默認變成浮點型,讀者可自行試驗。

主站蜘蛛池模板: 阿合奇县| 江北区| 临沭县| 泽库县| 英德市| 嵊泗县| 平山县| 略阳县| 梁平县| 阿尔山市| 比如县| 凌海市| 雷山县| 桓台县| 凭祥市| 磴口县| 宁陵县| 静海县| 宁都县| 巧家县| 抚宁县| 神木县| 昌吉市| 拜泉县| 静海县| 娱乐| 英山县| 玉门市| 怀来县| 永清县| 泽库县| 四川省| 宁津县| 海门市| 搜索| 台山市| 肇州县| 芒康县| 合肥市| 买车| 罗江县|