一文弄懂numpy數組

前言

學習數據分析,必繞不開numpy和pandas這兩個庫,numpy的ndarray數據結構和矩陣數據非常類似,最近搞科研的時候總是會用到,之前學的都忘記完了,所以,這次打算把numpy庫的基本用法記錄在一篇文章里,以便后面復習和使用。

ndarray多維數組創建

不要管復雜的概念,我們把多維數組看做成矩陣就行(實際使用中也是這樣的),例如,下面的二維數據,我們就可以看做成2行3列的矩陣。

import numpy as np

b = np.array([[1,2,3],[4,5,6]])
print(b)

# [[1 2 3]
# [4 5 6]]
一切從創建說起

一個特定的數據結構,肯定有著特定的創建方式,例如列表我們就是通過[]來創建,字典我們用{}來創建。ndarray多維數組用numpy庫的array方法來創建。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
  • object 數組或嵌套的數列(列表,元祖,數組,或者其他序列類型)
  • dtype 數組元素的數據類型,可選
  • copy 對象是否需要復制,可選
  • order 創建數組的樣式,C為行方向,F為列方向,A為任意方向(默認)
  • subok 默認返回一個與基類類型一致的數組
  • ndmin 指定生成數組的最小維度
# 1維數組
a = np.array([1,2,3])
print(a)

# [1,2,3]

# 2維數組
b = np.array([[1,2,3],[4,5,6]])
print(b)

# [[1 2 3]
# [4 5 6]]

# 指定數據類型
c = np.array([[1,2,3],[4,5,6]], dtype = np.float64)
print(c)

# reslut
[[1. 2. 3.]
 [4. 5. 6.]]
特殊創建方式

numpy也提供了一些函數用于創建特殊的數組。

  • zeros,全為0數組;
  • ones,全為1數據;
  • empty,垃圾值數組。
  • full,填充任意值
數值范圍創建數組

我們做循環的時候經常會用到range,可以取數值范圍,numpy中有個arange函數,可用于創建數組。

arr4 = np.arange(9)
arr4

# [0, 1, 2, 3, 4, 5, 6, 7, 8]

這樣創建的數組只能是一維的,arange函數經常和reshape一起使用(后面還會介紹),可以創建多維的數組。

arr5 = np.arange(9).reshape(3,3)
arr5

array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

ndarray數據屬性

屬性我們常需要調用的就是ndim,shape和dtype。

  • ndarray.ndim 秩,即軸的數量或維度的數量
  • ndarray.shape 數組的維度,對于矩陣,n 行 m 列
  • ndarray.size 數組元素的總個數,相當于 .shape 中 n*m 的值
  • ndarray.dtype ndarray 對象的元素類型
  • ndarray.itemsize ndarray 對象中每個元素的大小,以字節為單位
  • ndarray.flags ndarray 對象的內存信息
  • ndarray.real ndarray元素的實部
  • ndarray.imag ndarray 元素的虛部
  • ndarray.data 包含實際數組元素的緩沖區,由于一般通過數組的索引獲取元- 素,所以通常不需要使用這個屬性。
arr5 = np.arange(9).reshape(3,3)
print(arr5.ndim)
print(arr5.shape)
print(arr5.dtype)

2
(3, 3)
int64
改變數組數據類型

這個我們經常會用到,例如我們把整數數組轉換為浮點數數組,使用astype方法,用np.float64和'float64'都可以。

切片和索引

這部分內容非常重要,我們經常要選取特定的部分數據來操作,這里就必須要用到切片和索引。

小試牛刀

和列表的切片和索引很類似,都是從0開始計數,一維數組很簡單,也很好理解(和列表一樣操作就行),這里就不多介紹了。

二維數組,選取數據無非就以下幾種情況,選取特定的行,特定的列,或者組合,我們來看看怎么寫。

特定行

特定列

特定的行和列,這部分就有點不一樣了,如果行或者列中有切片,就能得到我們想要的結果,例如獲取2,3行以及1,3列。

如果我們想要獲取1,3行以及1,3列,用這種寫法結果就不對。

這其實獲取的是第一行第一列以及第三行第三列的值,這時候我們就需要用到花式索引。

花式索引

要使用np.ix_來完成。

其實不用這樣寫也可以,就是稍微復雜一點。我們先選取第一行和第三行,選完之后,再選取列。

布爾索引

還有一個很重要的概念,就是布爾索引。

這里有兩個函數需要介紹下,一個是all,一個是any,all是都為True,就返回True,any是一個為True,就返回True。

數組操作

修改數組形狀

之前我們簡單了解過reshape方法,可以改變數組的形狀。通過flatten或者ravel可以將數組從新進行展開。

合并和分割數組

合并數組主要有以下幾種方法:

  • concatenate 連接沿現有軸的數組序列
  • stack 沿著新的軸加入一系列數組。
  • hstack 水平堆疊序列中的數組(列方向)
  • vstack 豎直堆疊序列中的數組(行方向)

axis參數就是制定軸的方向,很多numpy函數都有這個參數,但是這個軸又不是很好理解,網上有很多的解釋,我這里說一個很簡單的解釋。例如二維數組,我們索引的時候arr[i,j],i就代表0,j就代表1,也就是說,行的方向就是0,列的方向就是1。

分割數組的函數為:

  • split 將一個數組分割為多個子數組
  • hsplit 將一個數組水平分割為多個子數組(按列)
  • vsplit 將一個數組垂直分割為多個子數組(按行)
numpy.split(ary, indices_or_sections, axis)
  • ary:被分割的數組
  • indices_or_sections:如果是一個整數,就用該數平均切分,如果是一個數組,為沿軸切分的位置(左開右閉)
  • axis:設置沿著哪個方向進行切分,默認為 0,橫向切分,即水平方向。為 1 時,縱向切分,即豎直方向
修改數組
  • resize 返回指定形狀的新數組
  • append 將值添加到數組末尾
  • insert 沿指定軸將值插入到指定下標之前
  • delete 刪掉某個軸的子數組,并返回刪除后的新數組
  • unique 查找數組內的唯一元素

這里要注意的是,如果不指定軸修改數組,會返回一維數組。

numpy.unique 函數用于去除數組中的重復元素。

numpy.unique(arr, return_index, return_inverse, return_counts)
  • arr:輸入數組,如果不是一維數組則會展開
  • return_index:如果為true,返回新列表元素在舊列表中的位置(下標),并以列表形式儲
  • return_inverse:如果為true,返回舊列表元素在新列表中的位置(下標),并以列表形式儲
  • return_counts:如果為true,返回去重數組中的元素在原數組中的出現次數
翻轉數組
  • transpose 對換數組的維度
  • ndarray.T 和 self.transpose() 相同
  • rollaxis 向后滾動指定的軸
  • swapaxes 對換數組的兩個軸

numpy.rollaxis 函數向后滾動特定的軸到一個特定位置,格式如下:

numpy.rollaxis(arr, axis, start)

參數說明:
arr:數組
axis:要向后滾動的軸,其它軸的相對位置不會改變
start:默認為零,表示完整的滾動。會滾動到特定位置。

numpy.swapaxes 函數用于交換數組的兩個軸。

數學和統計函數

numpy 包含大量的各種數學運算的函數,包括三角函數,算術運算的函數,復數處理函數等。這里就不一一介紹了,我們著重了解下復數處理函數。

numpy.around() 函數返回指定數字的四舍五入值。

numpy.around(a,decimals)

numpy.floor() 返回小于或者等于指定表達式的最大整數,即向下取整。

numpy.ceil() 返回大于或者等于指定表達式的最小整數,即向上取整。

算數函數

這里不一一介紹了,大家需要用到的時候自查即可。

  • add,相加
  • subtract,相減
  • multiply,相乘
  • divide,相除
  • reciprocal,函數返回參數逐元素的倒數。如 1/4 倒數為 4/1
  • power,第一個輸入數組中的元素作為底數,計算它與第二個輸入數組中相應元素的冪
  • mod,計算輸入數組中相應元素的相除后的余數。 函數 numpy.remainder() 也產生相同的結果。
統計函數

numpy 提供了很多統計函數,用于從數組中查找最小元素,最大元素,百分位標準差和方差等。sum,average等等,可以去numpy的官方文檔了解更多。

條件函數

numpy.where() 函數返回輸入數組中滿足給定條件的元素的索引。

numpy.extract() 函數根據某個條件從數組中抽取元素,返回滿條件的元素。

文件的存儲與讀取

  • load() 和 save() 函數是讀寫文件數組數據的兩個主要函數,默認情況下,數組是以未壓縮的原始二進制格式保存在擴展名為 .npy 的文件中。
  • savez() 函數用于將多個數組寫入文件,默認情況下,數組是以未壓縮的原始二進制格式保存在擴展名為 .npz 的文件中。
  • loadtxt() 和 savetxt() 函數處理正常的文本文件(.txt 等)。

savetxt() 函數是以簡單的文本文件格式存儲數據,對應的使用 loadtxt() 函數來獲取數據。

np.loadtxt(FILENAME, dtype=int, delimiter=' ')
np.savetxt(FILENAME, a, fmt="%d", delimiter=",")

總結

numpy是Python數據科學必學的第三方庫,但是說實話,一上來就學numpy其實是很痛苦的,他不像pandas那么直觀,有很多實際的有趣的案例,所以本篇文章主要是將numpy的基礎語法記錄下來,供大家和自己以后查詢所使用,最后附上numpy小抄給大家,我們下期再見。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容