作者 Airy
本文轉自 AiryData,轉載需授權
前面我們學習了numpy庫的簡單應用和數組的處理,今天來學習下數組的視圖和索引。
在學習ravel()函數的時候,我看到了視圖的概念,這讓我很驚訝,但是注意,這裡的視圖和資料庫中的視圖不是一樣的。在numpy中,視圖不是只讀的。關鍵在於,當前處理的是共享的數組視圖,還是數組數據的副本。舉例來說,可以取數組的一部分來生成視圖,這意味著,如果先將數組的某部分賦值給一個變量,然後修改原數組中相應位置的數據,那麼這個變量的值也會隨之變化。
這裡,我們通過動物面部照片(face)照片來創建數組,然後創建視圖,隨後修改。這裡的動物面部照片的數組是從Scipy函數獲得。
看一下代碼和效果圖如下:
#-*- coding:utf-8 -*-
import scipy.misc
import matplotlib.pyplot as plt
#創建圖片數組
face = scipy.misc.face()
print (face.shape)
#副本
acopy = face.copy()
#創建視圖
aview = face.view()
# 展示照片數組
plt.subplot(221)
plt.imshow(face)
#展示照片數據副本
plt.subplot(222)
plt.imshow(acopy)
#展示視圖
plt.subplot(223)
plt.imshow(aview)
# 展示改變後的
aview.flat = 0
plt.subplot(224)
plt.imshow(aview)
plt.show()
可以看到,只有一副圖片可以看到該動物圖片,如上圖所示。
同樣可以看到,程序最後修改了視圖,同時改變了原來的照片數組,這導致3副圖片全部變黑。而複製的數組沒有變化。所以,要記住:numpy中,視圖不是只讀的。
1、花式索引
花式索引是一種傳統的索引方法,它不使用整數或者切片。這裡,我們將利用花式索引來把動物圖片(face)對角線上的值全部置0,相當於沿著兩條交叉的對角線畫兩條黑線。
看一下完整代碼和效果。
#-*- coding:utf-8 -*-
import scipy.misc
import matplotlib.pyplot as plt
# 加載圖片數組
face = scipy.misc.face()
'''
這裡說明一下,默認是正方形的圖片,如果不是,則需要xmax和ymax的值一樣大小。(PS.Python3.6中scipy的圖片規格變成了768*1024)
'''
xmax = face.shape[0]
ymax = face.shape[0]
#ymax = face.shape[1]報錯,
#IndexError: shape mismatch: indexingarrays could not be broadcast together with shapes (768,) (1024,)
# 設置對角線的值為0
# x 0-xmax
# y 0-ymax
face[range(xmax), range(ymax)] = 0
# 設置另一條對角線的值為0
# x xmax-0
# y 0-ymax
face[range(xmax-1,-1,-1), range(ymax)] = 0
# 展示效果
plt.imshow(face)
plt.show()
2、基於位置列表的索引方法
下面利用ix_()函數將動物圖片的像素完全打亂。這個函數可以根據多個序列生成一個網格,它需要一個一維序列作為參數,並返回一個由numpy數組構成的元組。
利用位置列表索引numpy數組的過程如下:
① 打亂數組的索引。用numpy.random子程序包中的shuffle()函數把數組中的元素按隨機的索引號重新排列,使數組產生相應的變化。
② 使用代碼畫出打亂後的索引。
③ 照片的像素被完全打亂後,展示效果。
代碼和效果如下圖所示:
#-*- coding:utf-8 -*-
import scipy.misc
import matplotlib.pyplot as plt
import numpy as np
# 加載圖片數組
face = scipy.misc.face()
xmax = face.shape[0]
ymax = face.shape[1]
#打亂數組的索引
def shuffle_indices(size):
arr = np.arange(size)
np.random.shuffle(arr)
return arr
xindices = shuffle_indices(xmax)
np.testing.assert_equal(len(xindices), xmax)
yindices = shuffle_indices(ymax)
np.testing.assert_equal(len(yindices), ymax)
# 重畫打亂後的索引
plt.imshow(face[np.ix_(xindices, yindices)])
plt.show()
3、用布爾型變量索引numpy數組
布爾型索引是指根據布爾型數組來索引元素的方法,屬於花式索引系列。因為布爾型索引是花式索引的一個分類,所以它們的使用方法基本相同。
下面看代碼和效果展示。
#-*- coding:utf-8 -*-
import scipy.misc
import matplotlib.pyplot as plt
import numpy as np
# 加載圖片數組
face = scipy.misc.face()
#在對角線上畫點
def get_indices(size):
arr = np.arange(size)
return arr % 4 == 0
# 僅繪畫出選定的點
face1 = face.copy()
xindices = get_indices(face.shape[0])
yindices = get_indices(face.shape[0])#因為圖片大小不是正方形,這裡截取正方形圖片
face1[xindices, yindices] = 0
plt.subplot(211)
plt.imshow(face1)
face2 = face.copy()
#選取數組值介於最大值的1/4到3/4的元素,將其置0
face2[(face > face.max()/4) & (face < 3 * face.max()/4)] = 0
plt.subplot(212)
plt.imshow(face2)
#展示效果
plt.show()
今天學習一下Python中numpy數組的視圖和索引。希望通過上面的操作能幫助大家。如果你有什麼好的意見,建議,或者有不同的看法,我都希望你留言和我們進行交流、討論。
推薦閱讀
我分析了 6.5W 字的歌詞,看到了這樣的周杰倫!
柯潔又輸了,關於人工智慧AlphaGo你需要知道些什麼
男性人口過剩:亞洲性別比例失衡遠比你想像中嚴重
【書單】18本數據科學家必讀的R語言和Python相關書籍
如何像數據科學家一樣思考
北京VS上海,哪座城市人口更多?
我是如何一不小心阻止了勒索病毒的全球蔓延
用python抓取摩拜單車API數據並做可視化分析(源碼)
2017年大數據和數據科學的六大發展趨勢
你每天要花多少時間在手機上?
初級數據科學家求職時的 3 大必備能力
不可錯過的優質深度學習課程
職場 | 資料庫面試常問的一些基本概念
聽說你最擅長「拖」,你「拖」得過Excel嗎?
數據科學優質課程推薦#2:統計入門課程篇
歌手外科和猴姑,大數據告訴你白百何出軌後誰最慘
想學習數據科學?我們整理了一份優質編程入門課程清單
數據科學家在美國仍然是最熱門工作的3大原因
一個優秀數據分析師的準則