NumPy 高級(jí)索引和數(shù)組概念

NumPy 高級(jí)索引和數(shù)組概念

調(diào)整圖像尺寸

# 這個(gè)代碼用于調(diào)整圖像尺寸
# 來源:NumPy Cookbook 2e Ch2.3

import scipy.misc 
import matplotlib.pyplot as plt 
import numpy as np

# 將 Lena 圖像加載到數(shù)組中
lena = scipy.misc.lena()

# 圖像寬高
LENA_X = 512 
LENA_Y = 512

# 檢查圖像的寬高
np.testing.assert_equal((LENA_Y, LENA_X), lena.shape)

# 設(shè)置調(diào)整系數(shù)舟陆,水平 3桥胞,豎直 2
yfactor = 2 
xfactor = 3

# 調(diào)整圖像尺寸,水平(沿軸 1)拉伸 3 倍,豎直(沿軸 0 )拉伸兩倍
resized = lena.repeat(yfactor, axis=0)
              .repeat(xfactor, axis=1)

# 檢查調(diào)整后數(shù)組
np.testing.assert_equal((yfactor * LENA_Y, xfactor * LENA_Y), resized.shape)

# 繪制原圖像(兩行一列的第一個(gè)位置)
plt.subplot(211) 
plt.title("Lena") 
plt.axis("off") 
plt.imshow(lena)

# 繪制調(diào)整后圖像(兩行一列的第二個(gè)位置)
plt.subplot(212) 
plt.title("Resized") 
plt.axis("off") 
plt.imshow(resized) 
plt.show()

創(chuàng)建視圖及副本

# 來源:NumPy Cookbook 2e Ch2.4

import scipy.misc 
import matplotlib.pyplot as plt

# 加載 Lena 圖像
lena = scipy.misc.lena() 

# copy 創(chuàng)建副本昙沦,Python 對(duì)象復(fù)制,內(nèi)部?jī)?nèi)存復(fù)制
acopy = lena.copy() 

# view 創(chuàng)建視圖,Python 對(duì)象復(fù)制,內(nèi)部?jī)?nèi)存共享
aview = lena.view()

# 繪制 Lena 圖像(左上角)
plt.subplot(221) 
plt.imshow(lena)

# 繪制副本(右上角) 
plt.subplot(222) 
plt.imshow(acopy)

# 繪制視圖(左下角)
plt.subplot(223) 
plt.imshow(aview)

# 將副本所有元素清零
# 由于數(shù)組的數(shù)據(jù)保存在內(nèi)部?jī)?nèi)存中
# 副本不受影響常空,視圖(以及引用)會(huì)跟著變化
aview.flat = 0 

# 繪制修改后的視圖(右下角)
plt.subplot(224) 
plt.imshow(aview)

翻轉(zhuǎn)圖像

# 來源:NumPy Cookbook 2e Ch2.5

import scipy.misc 
import matplotlib.pyplot as plt

# 加載 Lena 圖像
lena = scipy.misc.lena()

# 繪制 Lena 圖像(左上角)
plt.subplot(221) 
plt.title('Original') 
plt.axis('off') 
plt.imshow(lena)

# 繪制翻轉(zhuǎn)后的圖像(右上角)
# Python 的 [::-1] 用于翻轉(zhuǎn)序列
# 這里翻轉(zhuǎn)了第二個(gè)維度,也就是水平翻轉(zhuǎn)
plt.subplot(222) 
plt.title('Flipped') 
plt.axis('off') 
plt.imshow(lena[:,::-1])


# 繪制切片后的圖像(左下角)
# 取圖像的左半部分和上半部分
plt.subplot(223)
plt.title('Sliced') 
plt.axis('off') plt.imshow(lena[:lena.shape[0]/2,:lena.shape[1]/2])

# 添加掩碼盖溺,將偶數(shù)元素變?yōu)?0 
# 布爾數(shù)組可用作索引 
mask = lena % 2 == 0 
masked_lena = lena.copy() 
masked_lena[mask] = 0 

# 繪制添加掩碼后的圖像(右下角)
plt.subplot(224) 
plt.title('Masked') 
plt.axis('off') 
plt.imshow(masked_lena)
plt.show()

花式索引

# 這個(gè)代碼通過將數(shù)組對(duì)角線上的元素設(shè)為 0 漓糙,來展示花式索引
# 花式索引就是使用數(shù)組作為索引來索引另一個(gè)數(shù)組
# 來源:NumPy Cookbook 2e Ch2.6

import scipy.misc 
import matplotlib.pyplot as plt

# 加載 Lena 圖像
# Load the Lena array 
lena = scipy.misc.lena() 

# 取圖片的寬和高
height = lena.shape[0] 
width = lena.shape[1]

# 使用花式索引將對(duì)角線上的元素設(shè)為 0
# x 為 0 ~ width - 1 的數(shù)組
# y 為 0 ~ height - 1 的數(shù)組
lena[range(height), range(width)] = 0

# 將副對(duì)角線上元素也設(shè)為 0
# x 為 width - 1 ~ 0 的數(shù)組
# y 為 0 ~ height - 1 的數(shù)組
lena[range(height), range(width - 1, -1, -1)] = 0

# 畫出帶對(duì)角線的 Lena 圖像
plt.imshow(lena) 
plt.show()

將位置列表用于索引

# 這個(gè)代碼的目的就是把 Lena 圖像弄花
# 來源:NumPy Cookbook 2e Ch2.7

import scipy.misc 
import matplotlib.pyplot as plt 
import numpy as np

# 加載 Lena 圖像 
lena = scipy.misc.lena() 

# 取圖像寬高
height = lena.shape[0] 
width = lena.shape[1]

def shuffle_indices(size):   
    '''   
    生成 0 ~ size - 1 的數(shù)組并打亂   
    '''
    arr = np.arange(size)   
    np.random.shuffle(arr)
    return arr

# 生成 x 隨機(jī)索引和 y 隨機(jī)索引
xindices = shuffle_indices(width) 
np.testing.assert_equal(len(xindices), width) 
yindices = shuffle_indices(height) np.testing.assert_equal(len(yindices), height)


# 畫出打亂后的圖像
# ix_ 函數(shù)將 yindices 轉(zhuǎn)置,xindices 不變
# 結(jié)果是一個(gè) height x 1 的數(shù)組和一個(gè) 1 x  width 的數(shù)組
# 用于索引時(shí)烘嘱,都會(huì)擴(kuò)展為 height x width 的數(shù)組
plt.imshow(lena[np.ix_(yindices, xindices)]) 
plt.show()

布爾索引

# 來源:NumPy Cookbook 2e Ch2.8

import scipy.misc 
import matplotlib.pyplot as plt 
import numpy as np

# 加載 Lena 圖像
lena = scipy.misc.lena()

# 取大小為 size 的數(shù)組
# 4 的倍數(shù)的下標(biāo)為 True昆禽,其余為 False
def get_indices(size):   
    arr = np.arange(size)   
    return arr % 4 == 0

# 繪制 Lena
# 對(duì)角線上每四個(gè)元素將一個(gè)元素清零 
lena1 = lena.copy() 
yindices = get_indices(lena.shape[0]) 
xindices = get_indices(lena.shape[1]) 
lena1[yindices, xindices] = 0 
plt.subplot(211) 
plt.imshow(lena1)

lena2 = lena.copy() 
# 最大值 1/4 ~ 3/4 之間的元素清零
# 這里用到了數(shù)組廣播
lena2[(lena > lena.max()/4) & (lena < 3 * lena.max()/4)] = 0 
plt.subplot(212) 
plt.imshow(lena2)
plt.show()

分離數(shù)獨(dú)的九宮格

# 來源:NumPy Cookbook 2e Ch2.9

import numpy as np

# 數(shù)獨(dú)是個(gè) 9x9 的二維數(shù)組
# 包含 9 個(gè) 3x3 的九宮格
sudoku = np.array([   
    [2, 8, 7, 1, 6, 5, 9, 4, 3],
    [9, 5, 4, 7, 3, 2, 1, 6, 8],
    [6, 1, 3, 8, 4, 9, 7, 5, 2],
    [8, 7, 9, 6, 5, 1, 2, 3, 4],
    [4, 2, 1, 3, 9, 8, 6, 7, 5],
    [3, 6, 5, 4, 2, 7, 8, 9, 1],
    [1, 9, 8, 5, 7, 3, 4, 2, 6],
    [5, 4, 2, 9, 1, 6, 3, 8, 7],
    [7, 3, 6, 2, 8, 4, 5, 1, 9]
])

# 要將其變成 3x3x3x3 的四維數(shù)組
# 但不能直接 reshape,因?yàn)檫@樣會(huì)把一行變成一個(gè)九宮格
shape = (3, 3, 3, 3)

# 大行之間隔 27 個(gè)元素蝇庭,大列之間隔 3 個(gè)元素
# 小行之間隔 9 個(gè)元素为狸,小列之間隔 1 個(gè)元素
strides = sudoku.itemsize * np.array([27, 3, 9, 1])

squares = np.lib.stride_tricks.as_strided(sudoku, shape=shape, strides=strides) 
print(squares)

'''
[[[[2 8 7]    [9 5 4]    [6 1 3]]
  [[1 6 5]    [7 3 2]    [8 4 9]]
  [[9 4 3]    [1 6 8]    [7 5 2]]]

 [[[8 7 9]    [4 2 1]    [3 6 5]]
  [[6 5 1]    [3 9 8]    [4 2 7]]
  [[2 3 4]    [6 7 5]    [8 9 1]]]

 [[[1 9 8]    [5 4 2]    [7 3 6]]
  [[5 7 3]    [9 1 6]    [2 8 4]]
  [[4 2 6]    [3 8 7]    [5 1 9]]]]
'''

數(shù)組廣播

# 來源:NumPy Cookbook 2e Ch2.10

import scipy.io.wavfile 
import matplotlib.pyplot as plt 
import urllib2 
import numpy as np

# 下載音頻文件
response = urllib2.urlopen('http://www.thesoundarchive.com/austinpowers/smashingbaby.wav') 
print(response.info())

# 將文件寫到磁盤
WAV_FILE = 'smashingbaby.wav' 
filehandle = open(WAV_FILE, 'w') 
filehandle.write(response.read()) 
filehandle.close() 

# 使用 SciPy 讀取音頻文件
sample_rate, data = scipy.io.wavfile.read(WAV_FILE)
print("Data type", data.dtype, "Shape", data.shape)
# ('Data type', dtype('uint8'), 'Shape', (43584L,))

# 繪制原始音頻文件(上方)
# y 值是數(shù)據(jù),x 值是數(shù)據(jù)的下標(biāo)
plt.subplot(2, 1, 1) 
plt.title("Original") 
plt.plot(data)

# 使音頻更安靜
# 數(shù)組廣播的意思是遗契,兩個(gè)數(shù)組進(jìn)行運(yùn)算時(shí)
# 較小尺寸的數(shù)組會(huì)擴(kuò)展自身辐棒,與較大數(shù)組對(duì)齊
# 如果數(shù)組與標(biāo)量運(yùn)算,那么將標(biāo)量與數(shù)組的每個(gè)元素運(yùn)算
# 所以這里數(shù)組的每個(gè)元素都 x 0.2
# 具體規(guī)則請(qǐng)見官方文檔
newdata = data * 0.2 
newdata = newdata.astype(np.uint8) 
print("Data type", newdata.dtype, "Shape", newdata.shape)
# ('Data type', dtype('uint8'), 'Shape', (43584L,))

# 保存更安靜的音頻
scipy.io.wavfile.write("quiet.wav", sample_rate, newdata)
    
# 繪制更安靜的音頻文件(下方)
plt.subplot(2, 1, 2) 
plt.title("Quiet") 
plt.plot(newdata)
plt.show()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牍蜂,一起剝皮案震驚了整個(gè)濱河市漾根,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲫竞,老刑警劉巖辐怕,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異从绘,居然都是意外死亡寄疏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門僵井,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陕截,“玉大人,你說我怎么就攤上這事批什∨┣” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵驻债,是天一觀的道長(zhǎng)乳规。 經(jīng)常有香客問我,道長(zhǎng)合呐,這世上最難降的妖魔是什么暮的? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮淌实,結(jié)果婚禮上冻辩,老公的妹妹穿的比我還像新娘猖腕。我一直安慰自己,他們只是感情好微猖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布谈息。 她就那樣靜靜地躺著缘屹,像睡著了一般凛剥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轻姿,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天犁珠,我揣著相機(jī)與錄音,去河邊找鬼互亮。 笑死犁享,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豹休。 我是一名探鬼主播炊昆,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼威根!你這毒婦竟也來了凤巨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤洛搀,失蹤者是張志新(化名)和其女友劉穎敢茁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體留美,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彰檬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谎砾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逢倍。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖景图,靈堂內(nèi)的尸體忽然破棺而出瓶堕,到底是詐尸還是另有隱情,我是刑警寧澤症歇,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布郎笆,位于F島的核電站,受9級(jí)特大地震影響忘晤,放射性物質(zhì)發(fā)生泄漏宛蚓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一设塔、第九天 我趴在偏房一處隱蔽的房頂上張望凄吏。 院中可真熱鬧,春花似錦、人聲如沸痕钢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)任连。三九已至蚤吹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間随抠,已是汗流浹背裁着。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拱她,地道東北人二驰。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像秉沼,于是被迫代替她去往敵國(guó)和親桶雀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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