Numpy:數(shù)組合矢量計算

Numpy绞铃, 數(shù)組和矢量計算包

前幾年前想學(xué)數(shù)據(jù)分析镜雨,于是就去學(xué)習(xí)Python的Numpy。然而看完《利用Python進行數(shù)據(jù)分析》后憎兽,也對它沒有多大印象的冷离。但是學(xué)了一段時間R語言,并且將R語言和Python進行一些比較纯命,再次學(xué)習(xí)Numpy就特別輕松了西剥。

由于學(xué)過R語言,我可以簡單認(rèn)為Numpy提供的多維數(shù)據(jù)對象ndarray就是Python版本的R語言的vector, matrixarray亿汞。幾乎沒有特殊說明瞭空,這兩者的任何操作都是一致的。

Numpy的部分功能如下:

  • ndarray, 一個具有矢量算術(shù)運算和復(fù)雜廣播能力的快速且節(jié)省空間的多維數(shù)組
  • 用于對整組數(shù)據(jù)進行快速運算的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)(無需編寫循環(huán)函數(shù))
  • 用于讀寫磁盤數(shù)據(jù)的工具以及用于操作內(nèi)存映射文件的工具
  • 線性代數(shù)疗我, 隨機數(shù)生成以及傅里葉變換功能
  • 用于繼承由C, C++, Fortran等語言編寫的代碼的工具

約定俗成:

import numpy as np

也就說不會特意去聲明導(dǎo)入numpy咆畏。

創(chuàng)建多維數(shù)組

多維數(shù)組有多種創(chuàng)建方法,其中最簡單的就是使用arrary函數(shù)吴裤。以一切序列類型的對象作為輸入

# 一維數(shù)組旧找,也就是R語言的最基本元素,vector
In [1]: import numpy as np
In [2]: data1 = [1,2,3,4,5]
In [3]: arr1 = np.array(data1)
In [4]: ?arr1 # 內(nèi)省下arr1對象
# 二維數(shù)組麦牺,也就是R語言的matrix
In [5]: data2 = [[1,2,3],[4,5,6]]
In [6]: arr2 = np.array(data2)
In [7]: ?arr2
# 在R語言中用dim()钮蛛, nrows, ncols查看數(shù)據(jù)維度
# 在Python中,這些可以用對象的方法查看剖膳。
In [10]: arr2.ndim
Out[10]: 2
In [11]: arr2.shape
Out[11]: (2, 3)
# 和R語言一樣魏颓,ndarray的對象不允許存在多種數(shù)據(jù)類型
# ndarray會自動根據(jù)輸入選擇最合適的數(shù)據(jù)類型
In [17]: data3 = [1,"string", True]
In [18]: arr3 = np.array(data3)
In [19]: arr3
Out[19]: 
array(['1', 'string', 'True'], 
      dtype='<U11')
In [20]: arr3.dtype
Out[20]: dtype('<U11')

除了用array轉(zhuǎn)換序列型數(shù)據(jù)輸入以外,還可以用arange(類似于內(nèi)置的ranges), asarray(類似于array)吱晒。后面的方法和線性代數(shù)密切相關(guān)甸饱,建議查看相應(yīng)的說明: ones ones_like, zeros zeros_like empty empty_like,eye identity

關(guān)于數(shù)據(jù)類型, 一般情況下我們沒必要對它太過于關(guān)注。但是對于大數(shù)據(jù)集叹话,則需要自己主動聲明偷遗。因為數(shù)據(jù)類型(dtype)負(fù)責(zé)將一塊內(nèi)存解釋為特定數(shù)據(jù)類型,即直接映射到相應(yīng)的機器表示渣刷。在R語言中有一類類型轉(zhuǎn)換函數(shù)(例如as.numeric)對數(shù)組內(nèi)的數(shù)據(jù)類型進行轉(zhuǎn)換鹦肿,在Numpy則通過dtype.

數(shù)組運算

R語言的一大特點就是矢量化運算,能用來檢查你是否理解R語言辅柴。簡單理解箩溃,就是不用循環(huán)就能對數(shù)據(jù)批量運算。

個人愚見:矢量化運算是Numpy用C語言編寫碌嘀,在C語言層面是也是循環(huán)涣旨。這也是為什么一個數(shù)組內(nèi)的數(shù)據(jù)類型要一致。

# R
> arr1
[1] 1 2 3 4 5
> arr1 + 1
[1] 2 3 4 5 6
# Python
In [29]: arr1 + 1
Out[29]: array([2, 3, 4, 5, 6])
In [35]: arr2 * 3
Out[35]: array([[ 3,  6,  9],
       [12, 15, 18]])
In [36]: arr2 * arr2
Out[36]: array([[ 1,  4,  9],
       [16, 25, 36]])      

我曾經(jīng)在 Python和R的異同(一)里談到原生Python要想實現(xiàn)R語言的矢量化就要使用列表推導(dǎo)式股冗, 而目前可以用numpy帶來的矢量化運算屬性了霹陡。

索引和切片

切片

在R語言和Numpy,包括原生的Python都有切片的功能止状, 所謂的切片(slicing) 就是從已有的數(shù)組中返回選定的元素烹棉,而索引(index)提供指向存儲在數(shù)組指定位置的數(shù)據(jù)值的指針

# R
arr <-  0:9
arr_sub <- arr[1:5]
# Python default list
data = [i for i in range(10)]
data_sub = data[0:5]
# Python Numpy
arr = np.arange(10)
arr_sub = arr[0:5]

上面的結(jié)果都是一致的怯疤,都是提取前5個元素浆洗。只不過要注意R語言的索引從1開始(5-1+1),而Python從0開始(5-0)集峦。表面看起來是相同的伏社,但其實Numpy切片得到只是原始數(shù)據(jù)的視圖(view),也就是淺復(fù)制塔淤,即你對Numpy切片后的數(shù)據(jù)進行操作摘昌,會影響到原始數(shù)據(jù)。

# Python Numpy
In [60]: arr_sub[1] = 100
In [61]: arr
Out[61]: array([  0, 100,   2,   3,   4,   5,   6,   7,   8,   9])
# Python default list
In [65]: data_sub[1] = 100
In [66]: data_sub
Out[66]: [0, 100, 2, 3, 4]
In [67]: data
Out[67]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# R 同Python默認(rèn)的列表

原因就是Numpy的目的是處理大數(shù)據(jù)高蜂,對大規(guī)模的數(shù)據(jù)進行實際復(fù)制會消耗不必要的性能和內(nèi)存聪黎。

numpy的索引操作和R語言幾乎一模一樣,分為切片索引备恤,布爾值索引稿饰,花式索引。這些都在《R語言實戰(zhàn)》基本數(shù)據(jù)管理章節(jié)中的數(shù)據(jù)集選取子集里面提及烘跺。

切片索引:

In [79]: arr = np.eye(9,9)
## 類似于R的操作
In [80]: arr[1,1]
Out[80]: 1.0
In [82]: arr[:,:]
## Python原來是通過遞歸對元素進行訪問
In [81]: arr[1][1]
Out[81]: 1.0

布爾值索引, 也就是先產(chǎn)生一個True脂崔, False的數(shù)組滤淳,然后根據(jù)這個數(shù)組提取數(shù)據(jù)

In [87]: arr[arr == 1]
Out[87]: array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])

花式索引, 就是提供指定順序的整數(shù)型列表

In [94]:  arr = np.empty((8,4))
In [95]: for i in range(8):
    ...:     arr[i] = i
    ...:
## 選取第4,3,1,6行數(shù)據(jù)
In [99]: arr[[3,2,0,5]]
Out[99]: array([ 3.,  2.,  0.,  5.])
## 在R里面就是
## arr[c(4,3,1,6)]

注意,如果一次性傳入多個索引數(shù)據(jù)砌左,Numpy會返回一維數(shù)組脖咐,但是R依舊會返回多維铺敌。這是目前第一個與R不太一樣,當(dāng)然和預(yù)想的結(jié)果也不同屁擅。

# R
> mdata <- matrix(1:32,nrow=8, ncol=4)
> mdata[c(2,6,8,2),c(1,4,2,3)]
     [,1] [,2] [,3] [,4]
[1,]    2   26   10   18
[2,]    6   30   14   22
[3,]    8   32   16   24
[4,]    2   26   10   18
# Numpy
In [110]: arr = np.arange(1,33).reshape(8,4)
In [111]: arr[[1,5,7,2],[0,3,1,2]]
Out[111]: array([ 5, 24, 30, 11])
## 為了解決這個問題偿凭,有兩種方法
In [112]: arr[[1,5,7,2]][:,[0,3,1,2]]
Out[112]: 
array([[ 5,  8,  6,  7],
       [21, 24, 22, 23],
       [29, 32, 30, 31],
       [ 9, 12, 10, 11]])
In [113]: arr[np.ix_([1,5,7,2],[0,3,1,2])]
Out[113]: 
array([[ 5,  8,  6,  7],
       [21, 24, 22, 23],
       [29, 32, 30, 31],
       [ 9, 12, 10, 11]])

: 花式索引以及布爾值索引和切片索引不同, 前者將數(shù)據(jù)復(fù)制到新的數(shù)組中派歌,而后者是原始數(shù)據(jù)的視圖弯囊。 可能原因是前兩者的得到數(shù)據(jù)在原始數(shù)據(jù)中位置不是整塊存放。

數(shù)據(jù)轉(zhuǎn)置和軸對換

轉(zhuǎn)置(transpose)是數(shù)據(jù)重塑的一種特殊形式胶果,返回的是原始數(shù)據(jù)的視圖(這一點和R不同)匾嘱。數(shù)組不僅有transpose方法,還有一個T屬性, 這兩者在二維數(shù)組上是相同的早抠。

arr = np.arange(1,33).reshape(8,4)
arr.T
np.transpose(arr)
# 線性代數(shù)的矩陣內(nèi)積
np.dot(arr.T, arr)

但是在更高維度上霎烙,T屬性依舊還是軸對換,transpose方法還需要提供軸編號組成的元組,這個真的是非常難以理解蕊连。

通用函數(shù):快速的元素級數(shù)組函數(shù)

我曾經(jīng)寫過一篇文章悬垃,叫做R語言的數(shù)據(jù)管理里面提到了基石函數(shù),來源于《R語言實戰(zhàn)》的高級數(shù)學(xué)管理甘苍。在numpy尝蠕,這類函數(shù)叫做通用函數(shù)(UNIVERSAL FUNCTIONS, UFUNC),能夠進行矢量化運算的函數(shù)羊赵。按照官方文檔的劃分趟佃,大致分為

  • 數(shù)學(xué)運算
  • 三角函數(shù)
  • 位運算函數(shù)
  • 比較函數(shù)
  • 浮點函數(shù)

按照《利用Pyton進行數(shù)據(jù)分析》可以分為一元函數(shù)和二元函數(shù)。

對于一些自定義的函數(shù)昧捷,R語言采用的apply家族函數(shù)進行矢量化操作闲昭,避免循環(huán)。而在Numpy則是frompyfunc靡挥。不過這已經(jīng)比較高級了序矩。

Numpy更多是Python進行科學(xué)計算的基礎(chǔ)包,因此數(shù)據(jù)分析部分的內(nèi)容就交給pandas吧跋破。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末簸淀,一起剝皮案震驚了整個濱河市撵术,隨后出現(xiàn)的幾起案子晓猛,更是在濱河造成了極大的恐慌,老刑警劉巖着倾,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拧簸,死亡現(xiàn)場離奇詭異劲绪,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門贾富,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉眷,“玉大人,你說我怎么就攤上這事颤枪『辜瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵畏纲,是天一觀的道長扇住。 經(jīng)常有香客問我,道長霍骄,這世上最難降的妖魔是什么台囱? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮读整,結(jié)果婚禮上簿训,老公的妹妹穿的比我還像新娘。我一直安慰自己米间,他們只是感情好强品,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屈糊,像睡著了一般的榛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逻锐,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天夫晌,我揣著相機與錄音,去河邊找鬼昧诱。 笑死晓淀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盏档。 我是一名探鬼主播凶掰,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜈亩!你這毒婦竟也來了懦窘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤稚配,失蹤者是張志新(化名)和其女友劉穎畅涂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體道川,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡午衰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年苹丸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苇经。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宦言,靈堂內(nèi)的尸體忽然破棺而出扇单,到底是詐尸還是另有隱情,我是刑警寧澤奠旺,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布蜘澜,位于F島的核電站,受9級特大地震影響响疚,放射性物質(zhì)發(fā)生泄漏鄙信。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一忿晕、第九天 我趴在偏房一處隱蔽的房頂上張望装诡。 院中可真熱鬧,春花似錦践盼、人聲如沸鸦采。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渔伯。三九已至,卻和暖如春肄程,著一層夾襖步出監(jiān)牢的瞬間锣吼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工蓝厌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留玄叠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓褂始,卻偏偏與公主長得像诸典,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子崎苗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容