Python數據分析之numpy學習(一)

2021-01-14 每天進步一點點2015

Python是一門不錯的動態語言,其應用的領域非常廣泛,如web開發、Linux運維、數據挖掘、機器學習、爬蟲、推薦系統等。在學完《廖雪峰Python2.7教程》感覺受益匪淺,掌握了基本的語法之後開始接觸用Python進行數據分析。這裡向大家推薦兩本書《Python數據分析》和《利用Python進行數據分析》,而這兩本書也是目前我正在學習的材料,雖然這兩本書都是基於Python2.x,但對於Python3.x也能正常運行。


本期將會涉及到Python模塊中的numpy,這是一個處理數組的強大模塊,而該模塊也是其他數據分析模塊(如pandas和scipy)的核心。下面將從這5個方面來介紹numpu模塊的內容:

1)數組的創建

2)有關數組的屬性和函數

3)數組元素的獲取--普通索引、切片、布爾索引和花式索引

4)統計函數與線性代數運算

5)隨機數的生成


數組的創建

numpy中使用array()函數創建數組,array的首個參數一定是一個序列,可以是元組也可以是列表。

一維數組的創建

可以使用numpy中的arange()函數創建一維有序數組,它是內置函數range的擴展版。

In [1]: import numpy as np

In [2]: ls1 = range(10)

In [3]: list(ls1)

Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [4]: type(ls1)

Out[4]: range


In [5]: ls2 = np.arange(10)

In [6]: list(ls2)

Out[6]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [7]: type(ls2)

Out[7]: numpy.ndarray

通過arange生成的序列就不是簡簡單單的列表類型了,而是一個一維數組。


如果一維數組不是一個規律的有序元素,而是人為的輸入,就需要array()函數創建了。

In [8]: arr1 = np.array((1,20,13,28,22))

In [9]: arr1

Out[9]: array([ 1, 20, 13, 28, 22])

In [10]: type(arr1)

Out[10]: numpy.ndarray

上面是由元組序列構成的一維數組。


In [11]: arr2 = np.array([1,1,2,3,5,8,13,21])    

In [12]: arr2

Out[12]: array([ 1,  1,  2,  3,  5,  8, 13, 21])

In [13]: type(arr2)

Out[13]: numpy.ndarray

上面是由列表序列構成的一維數組。


二維數組的創建

二維數組的創建,其實在就是列表套列表或元組套元組。

In [14]: arr3 = np.array(((1,1,2,3),(5,8,13,21),(34,55,89,144)))

In [15]: arr3

Out[15]:

array([[  1,   1,   2,   3],

[  5,   8,  13,  21],

[ 34,  55,  89, 144]])

上面使用元組套元組的方式。


In [16]: arr4 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])

In [17]: arr4

Out[17]:

array([[ 1,  2,  3,  4],

[ 5,  6,  7,  8],

[ 9, 10, 11, 12]])

上面使用列表套列表的方式。

對於高維數組在將來的數據分析中用的比較少,這裡關於高維數組的創建就不贅述了,構建方法仍然是套的方式。


上面所介紹的都是人為設定的一維、二維或高維數組,numpy中也提供了幾種特殊的數組,它們是:

In [18]: np.ones(3)  #返回一維元素全為1的數組

Out[18]: array([ 1.,  1.,  1.])


In [19]: np.ones([3,4])  #返回元素全為1的3×4二維數組

Out[19]:

array([[ 1.,  1.,  1.,  1.],

[ 1.,  1.,  1.,  1.],

[ 1.,  1.,  1.,  1.]])


In [20]: np.zeros(3) #返回一維元素全為0的數組

Out[20]: array([ 0.,  0.,  0.])


In [21]: np.zeros([3,4]) #返回元素全為0的3×4二維數組

Out[21]:

array([[ 0.,  0.,  0.,  0.],

[ 0.,  0.,  0.,  0.],

[ 0.,  0.,  0.,  0.]])


In [22]: np.empty(3) #返回一維空數組

Out[22]: array([ 0.,  0.,  0.])


In [23]: np.empty([3,4]) #返回3×4二維空數組

Out[23]:

array([[ 0.,  0.,  0.,  0.],

[ 0.,  0.,  0.,  0.],

[ 0.,  0.,  0.,  0.]])


有關數組的屬性和函數

當一個數組構建好後,我們看看關於數組本身的操作又有哪些屬性和函數:

In [24]: arr3

Out[24]:

array([[  1,   1,   2,   3],

[  5,   8,  13,  21],

[ 34,  55,  89, 144]])


In [25]: arr3.shape  #shape方法返回數組的行數和列數

Out[25]: (3, 4)


In [26]: arr3.dtype  #dtype方法返回數組的數據類型

Out[26]: dtype('int32')


In [27]: a = arr3.ravel()    #通過ravel的方法將數組拉直(多維數組降為一維數組)

In [28]: a

Out[28]: array([  1,   1,   2,   3,   5,   8,  13,  21,  34,  55,  89, 144])


In [29]: b = arr3.flatten()  #通過flatten的方法將數組拉直

In [30]: b

Out[30]: array([  1,   1,   2,   3,   5,   8,  13,  21,  34,  55,  89, 144])

兩者的區別在於ravel方法生成的是原數組的視圖,無需佔有內存空間,但視圖的改變會影響到原數組的變化。而flatten方法返回的是真實值,其值的改變並不會影響原數組的更改。

通過下面的例子也許就能明白了:

In [31]: b[:3] = 0

In [32]: arr3

Out[32]:

array([[  1,   1,   2,   3],

[  5,   8,  13,  21],

[ 34,  55,  89, 144]])

通過更改b的值,原數組沒有變化。


In [33]: a[:3] = 0

In [34]: arr3

Out[34]:

array([[  0,   0,   0,   3],

[  5,   8,  13,  21],

[ 34,  55,  89, 144]])

a的值變化後,會導致原數組跟著變化。


In [35]: arr4

Out[35]:

array([[ 1,  2,  3,  4],

[ 5,  6,  7,  8],

[ 9, 10, 11, 12]])


In [36]: arr4.ndim   #返回數組的維數

Out[36]: 2


In [37]: arr4.size   #返回數組元素的個數

Out[37]: 12


In [38]: arr4.T  #返回數組的轉置結果

Out[38]:

array([[ 1,  5,  9],

[ 2,  6, 10],

[ 3,  7, 11],

[ 4,  8, 12]])

如果數組的數據類型為複數的話,real方法可以返回複數的實部,imag方法返回複數的虛部。


介紹完數組的一些方法後,接下來我們看看數組自身有哪些函數可操作:

In [39]: len(arr4) #返回數組有多少行

Out[39]: 3


In [40]: arr3

Out[40]:

array([[  0,   0,   0,   3],

[  5,   8,  13,  21],

[ 34,  55,  89, 144]])


In [41]: arr4

Out[41]:

array([[ 1,  2,  3,  4],

[ 5,  6,  7,  8],

[ 9, 10, 11, 12]])


In [42]: np.hstack((arr3,arr4))

Out[42]:

array([[  0,   0,   0,   3,   1,   2,   3,   4],

[  5,   8,  13,  21,   5,   6,   7,   8],

[ 34,  55,  89, 144,   9,  10,  11,  12]])

橫向拼接arr3和arr4兩個數組,但必須滿足兩個數組的行數相同。


In [43]: np.vstack((arr3,arr4))  

Out[43]:

array([[  0,   0,   0,   3],

[  5,   8,  13,  21],

[ 34,  55,  89, 144],

[  1,   2,   3,   4],

[  5,   6,   7,   8],

[  9,  10,  11,  12]])

縱向拼接arr3和arr4兩個數組,但必須滿足兩個數組的列數相同。


In [44]: np.column_stack((arr3,arr4))    #與hstack函數具有一樣的效果

Out[44]:

array([[  0,   0,   0,   3,   1,   2,   3,   4],

[  5,   8,  13,  21,   5,   6,   7,   8],

[ 34,  55,  89, 144,   9,  10,  11,  12]])


In [45]: np.row_stack((arr3,arr4))    #與vstack函數具有一樣的效果

Out[45]:

array([[  0,   0,   0,   3],

[  5,   8,  13,  21],

[ 34,  55,  89, 144],

[  1,   2,   3,   4],

[  5,   6,   7,   8],

[  9,  10,  11,  12]])


reshape()函數和resize()函數可以重新設置數組的行數和列數:

In [46]: arr5 = np.array(np.arange(24))

In [47]: arr5    #此為一維數組

Out[47]:

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,

17, 18, 19, 20, 21, 22, 23])


In [48]: a = arr5.reshape(4,6)  

In [49]: a

Out[49]:

array([[ 0,  1,  2,  3,  4,  5],

[ 6,  7,  8,  9, 10, 11],

[12, 13, 14, 15, 16, 17],

[18, 19, 20, 21, 22, 23]])

通過reshape函數將一維數組設置為二維數組,且為4行6列的數組。


In [50]: a.resize(6,4)  

In [51]: a

Out[51]:

array([[ 0,  1,  2,  3],

[ 4,  5,  6,  7],

[ 8,  9, 10, 11],

[12, 13, 14, 15],

[16, 17, 18, 19],

[20, 21, 22, 23]])

通過resize函數會直接改變原數組的形狀。


數組轉換:tolist將數組轉換為列表,astype()強制轉換數組的數據類型,下面是兩個函數的例子:

In [53]: b = a.tolist()

In [54]: b

Out[54]:

[[0, 1, 2, 3],

[4, 5, 6, 7],

[8, 9, 10, 11],

[12, 13, 14, 15],

[16, 17, 18, 19],

[20, 21, 22, 23]]

In [55]: type(b)

Out[55]: list


In [56]: c = a.astype(float)

In [57]: c

Out[57]:

array([[  0.,   1.,   2.,   3.],

[  4.,   5.,   6.,   7.],

[  8.,   9.,  10.,  11.],

[ 12.,  13.,  14.,  15.],

[ 16.,  17.,  18.,  19.],

[ 20.,  21.,  22.,  23.]])


In [58]: a.dtype

Out[58]: dtype('int32')

In [59]: c.dtype

Out[59]: dtype('float64')



數組元素的獲取

通過索引和切片的方式獲取數組元素,一維數組元素的獲取與列表、元組的獲取方式一樣:

In [60]: arr7 = np.array(np.arange(10))

In [61]: arr7

Out[61]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [62]: arr7[3]     #獲取第4個元素

Out[62]: 3


In [63]: arr7[:3]    #獲取前3個元素

Out[63]: array([0, 1, 2])


In [64]: arr7[3:]    #獲取第4個元素即之後的所有元素

Out[64]: array([3, 4, 5, 6, 7, 8, 9])


In [65]: arr7[-2:]   #獲取末尾的2個元素

Out[65]: array([8, 9])


In [66]: arr7[::2]   #從第1個元素開始,獲取步長為2的所有元素

Out[66]: array([0, 2, 4, 6, 8])


二維數組元素的獲取:

In [67]: arr8 = np.array(np.arange(12)).reshape(3,4)

In [68]: arr8

Out[68]:

array([[ 0,  1,  2,  3],

[ 4,  5,  6,  7],

[ 8,  9, 10, 11]])


In [69]: arr8[1]     #返回數組的第2行

Out[69]: array([4, 5, 6, 7])


In [70]: arr8[:2]    #返回數組的前2行

Out[70]:

array([[0, 1, 2, 3],

[4, 5, 6, 7]])


In [71]: arr8[[0,2]]     #返回指定的第1行和第3行

Out[71]:

array([[ 0,  1,  2,  3],

[ 8,  9, 10, 11]])


In [72]: arr8[:,0]  #返回數組的第1列

Out[72]: array([0, 4, 8])


In [73]: arr8[:,-2:]    #返回數組的後2列

Out[73]:

array([[ 2,  3],

[ 6,  7],

[10, 11]])


In [74]: arr8[:,[0,2]]   #返回數組的第1列和第3列

Out[74]:

array([[ 0,  2],

[ 4,  6],

[ 8, 10]])


In [75]: arr8[1,2]   #返回數組中第2行第3列對應的元素

Out[75]: 6



布爾索引,即索引值為True和False,需要注意的是布爾索引必須輸數組對象。

In [76]: log = np.array([True,False,False,True,True,False])

In [77]: arr9 = np.array(np.arange(24)).reshape(6,4)

In [78]: arr9

Out[78]:

array([[ 0,  1,  2,  3],

[ 4,  5,  6,  7],

[ 8,  9, 10, 11],

[12, 13, 14, 15],

[16, 17, 18, 19],

[20, 21, 22, 23]])


In [79]: arr9[log]   #返回所有為True的對應行

Out[79]:

array([[ 0,  1,  2,  3],

[12, 13, 14, 15],

[16, 17, 18, 19]])


In [80]: arr9[-log]  #通過負號篩選出所有為False的對應行

Out[80]:

array([[ 4,  5,  6,  7],

[ 8,  9, 10, 11],

[20, 21, 22, 23]])


舉一個場景,一維數組表示區域,二維數組表示觀測值,如何選取目標區域的觀測?

In [81]: area = np.array(['A','B','A','C','A','B','D'])

In [82]: area

Out[82]:

array(['A', 'B', 'A', 'C', 'A', 'B', 'D'],

dtype='<U1')


In [83]: observes = np.array(np.arange(21)).reshape(7,3)

In [84]: observes

Out[84]:

array([[ 0,  1,  2],

[ 3,  4,  5],

[ 6,  7,  8],

[ 9, 10, 11],

[12, 13, 14],

[15, 16, 17],

[18, 19, 20]])


In [85]: observes[area == 'A']

Out[85]:

array([[ 0,  1,  2],

[ 6,  7,  8],

[12, 13, 14]])

返回所有A區域的觀測。


In [86]: observes[(area == 'A') | (area == 'D')] #條件值需要在&(and),|(or)兩端用圓括號括起來

Out[86]:

array([[ 0,  1,  2],

[ 6,  7,  8],

[12, 13, 14],

[18, 19, 20]])

返回所有A區域和D區域的觀測。


當然,布爾索引也可以與普通索引或切片混合使用:

In [87]: observes[area == 'A'][:,[0,2]]  

Out[87]:

array([[ 0,  2],

[ 6,  8],

[12, 14]])

返回A區域的所有行,且只獲取第1列與第3列數據。


花式索引:實際上就是將數組作為索引將原數組的元素提取出來

In [88]: arr10 = np.arange(1,29).reshape(7,4)

In [89]: arr10

Out[89]:

array([[ 1,  2,  3,  4],

[ 5,  6,  7,  8],

[ 9, 10, 11, 12],

[13, 14, 15, 16],

[17, 18, 19, 20],

[21, 22, 23, 24],

[25, 26, 27, 28]])


In [90]: arr10[[4,1,3,5]]  #按照指定順序返回指定行

Out[90]:

array([[17, 18, 19, 20],

[ 5,  6,  7,  8],

[13, 14, 15, 16],

[21, 22, 23, 24]])


In [91]: arr10[[4,1,5]][:,[0,2,3]] #返回指定的行與列

Out[91]:

array([[17, 19, 20],

[ 5,  7,  8],

[21, 23, 24]])


In [92]: arr10[[4,1,5],[0,2,3]]

Out[92]: array([17,  7, 24])

 請注意!這與上面的返回結果是截然不同的,上面返回的是二維數組,而這條命令返回的是一維數組。


如果想使用比較簡單的方式返回指定行以列的二維數組的話,可以使用ix_()函數

In [93]: arr10[np.ix_([4,1,5],[0,2,3])]

Out[93]:

array([[17, 19, 20],

[ 5,  7,  8],

[21, 23, 24]])

這與arr10[[4,1,5]][:,[0,2,3]]返回的結果是一致的。


----

由於正文部分不能超過20000字符,接下來的部分將在《Python數據分析之numpy學習(二)》中繼續講解。

----


使用Python進行數據分析,一般都會使用到numpy,pandas,scipy和matplotlib等模塊,而numpy是最為基礎的模塊,其他模塊的使用都是以numpy為核心,所以這裡講解了有關numpy的方方面面,這部分的學習非常重要,希望感興趣的朋友多看看這方面的文檔和動手操作。


每天進步一點點2015

學習與分享,取長補短,關注小號!


長按識別二維碼 馬上關注

相關焦點

  • Python數據分析之Numpy學習 2——NumPy 基礎 ndarray對象
    Python數據分析之Numpy學習 2 —— NumPy 基礎學習NumPy(Numerical Python)是高性能科學計算和數據分析的基礎包。NumPy的主要對象是同構數據多維容器(homogeneous multidimensional array)——ndarray,也就是說每一個ndarray都是一個相同類型元素組成的表格(二維)。
  • python數據分析基礎之numpy
    支持高級大量的維度數組與矩陣運算,是學習數據挖掘的基礎,今天我們就來總結下numpy的一些基礎用法。首先,在講numpy之前,我先帶領大家預習下大學學習過的矩陣的基礎知識。1、矩陣的基本概念矩陣:由m×n個數排列成 的m行n列的數表,稱為m行n列矩陣。實矩陣:元素是實數的矩陣。復矩陣:元素是負數的矩陣。
  • 資源|用Python和NumPy學習《深度學習》中的線性代數基礎
    本文系巴黎高等師範學院在讀博士 Hadrien Jean 的一篇基礎學習博客,其目的是幫助初學者/高級初學者基於深度學習和機器學習來掌握線性代數的概念。掌握這些技能可以提高你理解和應用各種數據科學算法的能力。
  • 大數據分析Python NumPy庫使用教程
    我將在大數據分析Python NumPy庫使用教程中學到什麼? 大數據分析Python NumPy庫使用教程為數據工程師提供有關NumPy的從零開始的培訓。這意味著您不需要具有NumPy的任何經驗,也不會浪費任何時間學習與數據工程工作無關的東西。
  • Python學習第114課——numpy中ndarray的四則運算
    【每天幾分鐘,從零入門python編程的世界!】我們為什麼要學習numpy?numpy其實就是number+Python的簡寫,意思就是通過Python對數據進行處理。要對數據進行處理,就少不了最基本的加減乘除等操作。
  • 學習筆記,從NumPy到Scrapy,學習Python不能錯過這些庫
    在網絡上看到幾位前輩寫了關於python深度學習庫的文章,對於小小白來說,因為我剛開始學python,我得承認自己看完後依然覺得雲裡霧裡的,不知道這些庫到底對我有什麼用處。所以我到網絡上搜集補充關於這些庫的說明內容,感覺在這個整理資料的過程中,對於這些python程序庫了解了更多,以下是我整理的學習筆記。
  • Python學習第119課——numpy中的broadcasting
    【每天幾分鐘,從零入門python編程的世界!】這節課我們學習numpy中的數據的一個多變的特性--broadcasting,broadcasting的官方的說明比較麻煩,我們這裡把它簡化一下,就把它當做「腦補」的意思。我們舉例來說明。
  • 好程式設計師Python培訓分享numpy簡介
    好程式設計師Python培訓分享numpy簡介:一、numpy簡介:NumPy是一個功能強大的Python庫,主要用於對多維數組執行計算。NumPy這個詞來源於兩個單詞-- Numerical和Python。NumPy提供了大量的庫函數和操作,可以幫助程式設計師輕鬆地進行數值計算。
  • 數據分析-numpy庫快速了解
    NumPy是SciPy、Pandas等數據處理或科學計算庫的基礎2.numpy庫有什麼用numpy用途是很廣的,涉及到數字計算等都可以使用,它的優勢在於底層是C語言開發的數據非常快。 數組對象可以去掉元素間運算所需的循環,使一維向量更像單個數據 設置專門的數組對象,經過優化,可以提升這類應用的運算速度觀察:科學計算中,一個維度所有數據的類型往往相同 數組對象採用相同的數據類型,有助於節省運算和存儲空間具體可以看下面一個例子:(來源嵩天老師案例)3.numpy庫怎麼使用先安裝numpy
  • Python的武器庫05:numpy模塊(下)
    說到程式語言python,有一個著名的格言"餘生太短,只用python"。如果要分析為什麼會存在這麼一句格言?python的語法並不簡單,有複雜難懂的部分,之所以有這樣一句格言,是因為python中有很多強大的模塊,就像一個武器庫。
  • python數據科學系列:numpy入門詳細教程
    python數據科學基礎庫主要是三劍客:numpy,pandas以及matplotlib,每個庫都集成了大量的方法接口,配合使用功能強大。numpy:numerical python縮寫,提供了底層基於C語言實現的數值計算庫,與python內置的list和array數據結構相比,其支持更加規範的數據類型和極其豐富的操作接口,速度也更快num
  • Python數據分析之numpy數組全解析
    1 什麼是numpy2 numpy數組創建2.1 基本方法:np.array()2.2 通用方法:np.ones()、np.zeros()、np.eye()2.3 讀取外部數據3 numpy中數組的數據類型4 numpy中數組的形狀5 索引與切片5.1 按索引取值
  • Python學習第117課——numpy中dot的運用舉例
    【每天幾分鐘,從零入門python編程的世界!】上節我們學習了最基礎的matrix的運算,可能有小夥伴覺得這都要涉及高等數學知識了,確實如果你想做數據科學、做人工智慧,統計學、概率論等數學知識,尤其是算法是繞不過去的坎,但是不要怕!!!
  • numpy中的數據類型對象有哪些
    Numpy數據類型numpy是一個python擴展包,它可以為我們提供更精確的科學技術,更強大的數學能力。為此,numpy定義了比python更豐富的數據類型來達成目的。數據類型以上就是一系列Numpy中提供的數據類型。需要理解的是,Numpy中的數據類型,和python本身的數據類型是不同的。Numpy中的數據類型,實質是數據類型對象dtype的實例。
  • Python學習第113課——numpy中用條件判斷去篩選數組中的元素
    【每天幾分鐘,從零入門python編程的世界!】之前我們學習了如何在numpy中查找數組元素的方法和技巧,現在我們學習如何用條件判斷的方式篩選數組的元素。●numpy中的數組可以直接進行比較直接上代碼:運行結果:我們看到,condition列印出來,它的結構和h的結構一樣。
  • 懂Excel輕鬆入門Python數據分析包pandas(二十七):IF函數代替者
    此系列文章收錄在:數據大宇宙 > 數據處理 > E-pd轉發本文並私信我"python",即可獲得Python資料以及更多系列文章(持續更新的)經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。
  • Python學習第116課——numpy.dot和矩陣相乘的數學運算
    【每天幾分鐘,從零入門python編程的世界!】關於numpy中數組的相乘,我們學習了對位相乘(用numpy.multiply、或*直接相乘,比如數組a和b的對位相乘就是numpy.multiply(a,b)或a*b)和一維數組的點乘(dot product,也有人叫inner product,比如一維數組a和b的點乘就是a.b)。
  • Python數據分析類庫系列-Numpy之多維數組ndarray
    接下來我們通過一組實例來了解Numpy算法的優勢 import numpy as np my_arr = np.arange(1000000)my_list = list(range(1000000)) %time for _ in range(10):
  • Python學習120課 pandas簡介kaggle下載數據及pandas讀取外部數據
    【每天幾分鐘,從零入門python編程的世界!】numpy的基本的東西我們學習差不多了,後面具體應用中遇到問題具體分析,然後去深入了解遇到的新的知識點就行。現在我們開始學習pandas,pandas一般用的更多,pandas是基於numpy去寫的。pandas是一個專門做數據結構和數據分析的庫。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    基於liunx系統的python教程,課程裡也有liunx操作的詳細教學,不用擔心學習時不會操作liunx系統。 22機器學習 23深度學習 24數據結構和算法 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰2 32深度學習必備原理與實戰3