NumPy 核心和模塊

NumPy 核心和模塊

# 來(lái)源:NumPy Essentials ch4

步長(zhǎng)


# 步長(zhǎng)是每個(gè)維度相鄰兩個(gè)元素的偏移差值
import numpy as np

x = np.arange(8, dtype = np.int8)
x
# array([0, 1, 2, 3, 4, 5, 6, 7])
# x 是一維數(shù)組,步長(zhǎng)為 1城舞,因?yàn)?int8 占一個(gè)字節(jié)
x.strides
# (1,)
# data 屬性可以觀察原始數(shù)據(jù)
str(x.data)
# '\x00\x01\x02\x03\x04\x05\x06\x07'

# 將 x 轉(zhuǎn)換為 2x4 的二維數(shù)組
x.shape = 2, 4 
x
'''
array([[0, 1, 2, 3], 
       [4, 5, 6, 7]], dtype=int8) 
'''
# 第二維的步長(zhǎng)是 1夕晓,等于類型大小
# 第一維的步長(zhǎng)是 4,等于第二位步長(zhǎng)乘以第二維的長(zhǎng)度
x.strides
# (4, 1)
# 原始數(shù)據(jù)還是不變
str(x.data) 
# '\x00\x01\x02\x03\x04\x05\x06\x07' 

# 轉(zhuǎn)換為 1x4x2 的三位數(shù)組
x.shape = 1,4,2
# 第三維的步長(zhǎng)是 1,等于類型大小
# 第二維的步長(zhǎng)是 2灾炭,等于第三維步長(zhǎng)乘以第三維的長(zhǎng)度
# 第一維的步長(zhǎng)是 8,等于第二維步長(zhǎng)乘以第二維的長(zhǎng)度
x.strides 
# (8, 2, 1)
str(x.data)
# '\x00\x01\x02\x03\x04\x05\x06\x07' 

'''
對(duì)于連續(xù)數(shù)組(flags 中為連續(xù)):
strides[ndim - 1] = itemsize
strides[i] = strides[i + 1] * shape[i + 1]

def calc_strides(shape, itemsize):
    ndim = len(shape)
    strides = [0] * ndim
    strides[-1] = itemsize
    for i in xrange(ndim - 2, -1, -1):
        strides[i] = strides[i + 1] * shape[i + 1]
    return strides
'''

# 再來(lái)看看不連續(xù)數(shù)組
# 這里 x 是連續(xù)的泊业,y 是不連續(xù)的
x = np.ones((10000,)) 
y = np.ones((10000 * 100, ))[::100] 
# 它們的形狀一樣,都是 10000 大小的一維數(shù)組
x.shape, y.shape 
# ((10000,), (10000,))
# 值也一樣 
x == y 
# array([ True,  True,  True, ...,  True,  True, True], dtype=bool) 

# 查看它們的標(biāo)識(shí)
x.flags 
'''
C_CONTIGUOUS : True 
F_CONTIGUOUS : True 
OWNDATA : True 
WRITEABLE : True 
ALIGNED : True 
UPDATEIFCOPY : False 

由于 x 是一維數(shù)組啊易,所以行和列都連續(xù)
'''
y.flags 
'''
C_CONTIGUOUS : False 
F_CONTIGUOUS : False 
OWNDATA : False 
WRITEABLE : True 
ALIGNED : True 
UPDATEIFCOPY : False 

y 是由切片產(chǎn)生的吁伺,所以行和列都不連續(xù)
并且沒(méi)有自己的數(shù)據(jù)
'''

# 它們的步長(zhǎng)是不一樣的
# 某個(gè)維度在切片時(shí)提供了步長(zhǎng)
# 數(shù)組的步長(zhǎng)也會(huì)乘這個(gè)數(shù)
x.strides, y.strides 
# ((8,), (800,)) 

'''
不連續(xù)數(shù)組由于不是緩存友好的
訪問(wèn)也較慢

%timeit x.sum() 
100000 loops, best of 3: 13.8 μs per loop 
%timeit y.sum() 
10000 loops, best of 3: 25.9 μs per loop 

結(jié)構(gòu)化數(shù)組

# 結(jié)構(gòu)化數(shù)組也叫作記錄數(shù)組
# 它的元素是一條記錄

# 要?jiǎng)?chuàng)建這種數(shù)組,我們需要使用數(shù)組來(lái)表示數(shù)據(jù)租谈,每個(gè)元素是一個(gè)元組篮奄,表示記錄
# 然后我們需要指定類型,使用數(shù)組來(lái)表示割去,每個(gè)元素是個(gè)二元組
# 字段用二元組表示窟却,第一項(xiàng)是名稱,第二項(xiàng)是類型
x = np.array([(1, 0.5, 'NumPy'), (10, -0.5, 'Essential')], 
      dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', 'S10')]) 

# 位置下標(biāo)得到的是元組(記錄)
x[0] 
# (1, 0.5, 'NumPy') 
# 還可以通過(guò)字段名稱訪問(wèn)
# 得到的是字段值的數(shù)組
x['f2'] 
# array(['NumPy', 'Essential'], dtype='|S10') 

# 字段值的數(shù)據(jù)還是視圖
# 修改它會(huì)修改原始數(shù)組
y = x['f0'] 
y 
# array([ 1, 10]) 
y[:] = y * 10 
y 
# array([ 10, 100]) 
y[:] = y + 0.5 
y 
# array([ 10, 100]) 
x 
'''
array([(10, 0.5, 'NumPy'), (100, -0.5, 'Essential')], 
    dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', 'S10')]) 
'''

# 字段的每個(gè)元素也可以是數(shù)組
z = np.ones((2,), dtype = ('3i4, (2,3)f4')) 
z 
'''
array([([1, 1, 1], [[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]), 
       ([1, 1, 1], [[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]])], 
      dtype=[('f0', '<i4', (3,)), ('f1', '<f4', (2, 3))]) 
'''

# 我們也可以給字段類型重命名
x.dtype.names 
# ('f0', 'f1', 'f2') 
x.dtype.names = ('id', 'value', 'note') 
x 
''' 
array([(10, 0.5, 'NumPy'), (100, -0.5, 'Essential')], 
      dtype=[('id', '<i4'), ('value', '<f4'), ('note', 'S10')]) 
'''

# 也可以使用字典來(lái)表示類型
# names 鍵是名稱列表呻逆,formats 鍵是類型列表
dict_ex = np.zeros((2,), dtype = {'names':['id', 'value'], 'formats':['i4', '2f4']}) 
dict_ex 
'''
array([(0, [0.0, 0.0]), (0, [0.0, 0.0])], 
      dtype=[('id', '<i4'), ('value', '<f4', (2,))]) 
'''

# 屬性索引也支持多值
x[['id', 'note']]
'''
array([(10, 'NumPy'), (100, 'Essential')], 
      dtype=[('id', '<i4'), ('note', 'S10')]) 
'''

日期時(shí)間

# datetime64 可以使用字符串來(lái)構(gòu)造
x = np.datetime64('2015-04-01') 
y = np.datetime64('2015-04') 
x.dtype, y.dtype 
# (dtype('<M8[D]'), dtype('<M8[M]'))

# 我們也可以指定最小單位
# 缺失的值會(huì)使用 1 來(lái)填充
y = np.datetime64('2015-04', 'D') 
y, y.dtype 
# (numpy.datetime64('2015-04-01'), dtype('<M8[D]')) 
# 我們可以使用 arange 來(lái)生成日期數(shù)組
x = np.arange('2015-01', '2015-04', dtype = 'datetime64[M]') 
x 
# array(['2015-01', '2015-02', '2015-03'], dtype='datetime64[M]') 

# 但是只包含日期單位時(shí)夸赫,不能指定時(shí)間單位
y = np.datetime64('2015-04-01', 's') 
# TypeError: Cannot parse "2015-04-01" as unit 's' using casting rule 'same_kind' 

# datetime64 相減會(huì)生成 timedelta64
x 
# array(['2015-01', '2015-02', '2015-03'], dtype='datetime64[M]') 
y = np.datetime64('2015-01-01') 
x - y
# array([ 0, 31, 59], dtype='timedelta64[D]') 

# 我們也可以將 datetime64 與 timedelta64 相加
# 這表示 2015 年 1 月 1 日加上 12 個(gè)月是 2016 年 1 月 1 日
np.datetime64('2015') + np.timedelta64(12, 'M') 
# numpy.datetime64('2016-01') 
# 或者 timedelta64 之間的運(yùn)算
# 這表示一周是 7 天
np.timedelta64(1, 'W') / np.timedelta64(1, 'D') 
# 7.0 

x 
# array(['2015-01', '2015-02', '2015-03'], dtype='datetime64[M]') 
# tolist 將 NumPy 數(shù)組轉(zhuǎn)換成 Python 列表
# 如果數(shù)組是 datetime64 類型
# 每個(gè)元素會(huì)轉(zhuǎn)為原生的 datetime.data
x.tolist() 
'''
[datetime.date(2015, 1, 1), 
 datetime.date(2015, 2, 1), 
 datetime.date(2015, 3, 1)] 
'''

# datetime64 的 item 方法會(huì)返回等價(jià)的 datetime.date 對(duì)象
[element.item() for element in x]
'''
[datetime.date(2015, 1, 1), 
 datetime.date(2015, 2, 1), 
 datetime.date(2015, 3, 1)] 
'''

NumPy 文件 IO


# 首先創(chuàng)建記錄數(shù)組
id = np.arange(1000) 
value = np.random.random(1000) 
day = np.random.random_integers(0, 365, 1000) * np.timedelta64(1,'D') 
date = np.datetime64('2014-01-01') + day 
# np.core.records.fromarrays 從字段數(shù)組創(chuàng)建記錄數(shù)組
rec_array = np.core.records.fromarrays([id, value, date], names='id, value, date', formats='i4, f4, a10') 
rec_array[:5] 
'''
rec.array([(0, 0.07019801437854767, '2014-07-10'), 
       (1, 0.4863224923610687, '2014-12-03'), 
       (2, 0.9525277614593506, '2014-03-11'), 
       (3, 0.39706873893737793, '2014-01-02'), 
       (4, 0.8536589741706848, '2014-09-14')], 
      dtype=[('id', '<i4'), ('value', '<f4'), ('date', 'S10')]) 
'''

# savetxt 以純文本形式保存數(shù)組
# 將格式指定為逗號(hào)分隔,所以它是 CSV
np.savetxt('./record.csv', rec_array, fmt='%i,%.4f,%s') 

# 我們需要將其讀進(jìn)來(lái)
# 并指定類型和分隔符
# 使用 np.loadtxt 也可以
read_array = np.genfromtxt('./record.csv', dtype='i4,f4,a10', delimiter=',', skip_header=0) 
read_array[:5] 
'''
array([(0, 0.07020000368356705, '2014-07-10'), 
       (1, 0.486299991607666, '2014-12-03'), 
       (2, 0.9524999856948853, '2014-03-11'), 
       (3, 0.3971000015735626, '2014-01-02'), 
       (4, 0.8536999821662903, '2014-09-14')], 
      dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', 'S10')]) 
'''

# 為字段重命名
read_array.dtype.names = ('id', 'value', 'date')

# 獲取 value 字段是否大于 0.75
mask = read_array['value'] >= 0.75 
from numpy.lib.recfunctions import append_fields 
# append_fields 添加新的字段
# 參數(shù)依次是源數(shù)組咖城、新字段名稱茬腿、數(shù)據(jù)和類型
read_array = append_fields(read_array, 'mask', data=mask, dtypes='i1') 
read_array[:5] 
'''
masked_array(data = [(0, 0.07020000368356705, '2014-07-10', 0) 
 (1, 0.486299991607666, '2014-12-03', 0)
 
 (2, 0.9524999856948853, '2014-03-11', 1) 
 (3, 0.3971000015735626, '2014-01-02', 0) 
dtype = [('id', '<i4'), ('value', '<f4'), ('date', 'S10'), ('mask','i1')]) 
'''
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宜雀,隨后出現(xiàn)的幾起案子切平,更是在濱河造成了極大的恐慌,老刑警劉巖辐董,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悴品,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡郎哭,警方通過(guò)查閱死者的電腦和手機(jī)他匪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)夸研,“玉大人邦蜜,你說(shuō)我怎么就攤上這事『ブ粒” “怎么了悼沈?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姐扮。 經(jīng)常有香客問(wèn)我絮供,道長(zhǎng),這世上最難降的妖魔是什么茶敏? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任壤靶,我火速辦了婚禮,結(jié)果婚禮上惊搏,老公的妹妹穿的比我還像新娘贮乳。我一直安慰自己忧换,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布向拆。 她就那樣靜靜地躺著亚茬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浓恳。 梳的紋絲不亂的頭發(fā)上刹缝,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音颈将,去河邊找鬼梢夯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吆鹤,可吹牛的內(nèi)容都是我干的厨疙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼疑务,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了梗醇?” 一聲冷哼從身側(cè)響起知允,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叙谨,沒(méi)想到半個(gè)月后温鸽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡手负,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年涤垫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竟终。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝠猬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出统捶,到底是詐尸還是另有隱情榆芦,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布喘鸟,位于F島的核電站匆绣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏什黑。R本人自食惡果不足惜崎淳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愕把。 院中可真熱鬧拣凹,春花似錦森爽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至祈惶,卻和暖如春雕旨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捧请。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工凡涩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疹蛉。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓活箕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親可款。 傳聞我的和親對(duì)象是個(gè)殘疾皇子育韩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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