Python之numpy數組學習(四)——索引和視圖

2021-02-21 CDA數據分析師


作者   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大原因

一個優秀數據分析師的準則

相關焦點

  • Python數據分析之numpy數組全解析
    1 什麼是numpy2 numpy數組創建2.1 基本方法:np.array()2.2 通用方法:np.ones()、np.zeros()、np.eye()2.3 讀取外部數據3 numpy中數組的數據類型4 numpy中數組的形狀5 索引與切片5.1 按索引取值
  • Python乾貨 | Python數據分析之numpy數組全解析
    1 什麼是numpy2 numpy數組創建2.1 基本方法:np.array()2.2 通用方法:np.ones()、np.zeros()、np.eye()2.3 讀取外部數據3 numpy中數組的數據類型4 numpy中數組的形狀5 索引與切片5.1 按索引取值
  • Python之numpy數組學習(一)
    作者  Airy本文轉自AiryData,轉載需授權前面已經安裝並學習了Python中的科學計算庫,今天主要學習下numpy數組。Numpy中的多維數組稱為ndarray,它有兩個組成部分。在數組的處理過程中,原始數據不受影響,變化的只是元數據。Numpy數組通常是由相同種類的元素組成,即數組中數據類型必須一致。好處是:數組元素類型相同,可輕鬆確定存儲數組所需的空間大小。同時,numpy可運用向量化運算來處理整個數組。Numpy數組的索引從0開始。
  • Python之numpy數組學習(三)
    作者  Airy本文轉自AiryData,轉載需授權前面我們學習了numpy庫的簡單應用和數組的處理,今天來學習下比較重要的如何拆分數組。數組可以從縱向、橫向和深度方向來拆分數組,相關函數有hsplit()、vsplit()、sdplit()和split()。我們既可以把數組分成相同形狀的數組,也可以從規定的位置開始切取數組(先介紹,代碼在後)。橫向拆分:對於一個3×3數組,可以沿著橫軸方向將其分解為3部分,並且各部分的大小和形狀完全一致。
  • Pandas和Numpy的視圖和拷貝
    False.to_numpy()返回一個數組,df和view_of_df的.base屬性值相同,它們共享相同的數據。切片返回的是視圖,但是,索引則不同了。下面演示,使用列表作為索引,得到了原始數組的拷貝。
  • 數據分析必知必會(四):數組的轉換、視圖、拷貝、索引和廣播(這裡的「廣播」是一個數組的應用:數據處理舊手機鈴聲)
    (由於原圖有露點,這裡的截圖僅作參考和學習分析,請客觀公正嚴肅對待這一張60多歲的老奶奶的圖片)(這張照片目前已被學術界:美國圖像處理研究所下架,現在使用的是梯子和其他圖片)18、數組的視圖和拷貝(改變數組的參數,視圖顏色發生變化)當前處理的是共享的數組視圖,並且還是數組數據的副本。
  • Python數據分析基礎之NumPy學習 (上)
    >機器學習之 Sklearn深度學習之 TensorFlow深度學習之 Keras深度學習之 PyTorch深度學習之 MXnetNumpy 是 Python 專門處理高維數組 (high dimensional array) 的計算的包,每次使用它遇到問題都會它的官網 (www.numpy.org).
  • 學習Python必知的Numpy函數
    大量的擴展包是 Python 的一大特色,包括各種適用於數據分析的例程和函數。有了這些擴展包,數據科學家們可以不用重複造輪子,節省了很多時間。其中一個重要的數學擴展包就是 NumPy。NumPy 是一個基礎數學包,以其高效的多維數組函數而聞名,適用於線性代數,傅立葉變換,邏輯運算等。
  • Python數據分析之numpy學習(一)
    這裡向大家推薦兩本書《Python數據分析》和《利用Python進行數據分析》,而這兩本書也是目前我正在學習的材料,雖然這兩本書都是基於Python2.x,但對於Python3.x也能正常運行。本期將會涉及到Python模塊中的numpy,這是一個處理數組的強大模塊,而該模塊也是其他數據分析模塊(如pandas和scipy)的核心。
  • Python入門教程(二):Numpy數組基礎
    Python中的數組操作幾乎等同於Numpy數組操作,今天我們會展示用Numpy數組操作獲取數據或者子數組,對數組進行分裂,變形和連接的例子。首先,我們先介紹幾類基本的數組操作:數組的屬性確定數組的大小,形狀,儲存大小,數據類型數組的索引:獲取和設置各個元素的值數組的切分:在大的數組中獲取或設置更小的子數組
  • python:numpy入門詳細教程
    numpy:numerical python縮寫,提供了底層基於C語言實現的數值計算庫,與python內置的list和array數據結構相比,其支持更加規範的數據類型和極其豐富的操作接口,速度也更快num
  • Python冬令營-Numpy 使用簡介
    source: https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial聲明:本篇推送的主要內容翻譯自:https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial
  • python數據分析:numpy入門
    微信公眾號:學點啥玩點啥小白友好型python數據分析:numpy入門numpy:一個在python中做科學計算的基礎庫,重在數值計算,也是大部分python科學計算庫的基礎庫,多用於在大型、多維數組上執行數值計算。
  • python數據分析專題 (10):numpy使用
    NumPy的ndarry類型也可以進行很多操作,例如數組的索引,組合等,這次內容介紹一些關於numpy多維數組的操作。
  • python數據科學系列:numpy入門詳細教程
    numpy:numerical python縮寫,提供了底層基於C語言實現的數值計算庫,與python內置的list和array數據結構相比,其支持更加規範的數據類型和極其豐富的操作接口,速度也更快numpy的兩個重要對象是
  • Python使用ctypes模塊調用DLL函數之C語言數組與numpy數組傳遞
    python使用ctypes模塊調用DLL函數之傳遞數值、指針與字符串參數、一般情況下,DLL函數中傳遞C語言類型的數組,在接收到Python語言中時,通常將其轉換為numpy庫裡面的數組類型,這樣做的好處是可以藉助於numpy強大的分析處理功能對數據直接作後續處理。這次通過例子演示下C語言數組到numpy數組之間是怎樣傳遞的。
  • Python Numpy 數組的基本操作示例
    Numpy中的數組是一個元素表(通常是數字),所有元素都是相同的類型,由一個正整數元組索引。在Numpy中,數組的維數稱為數組的秩。一個整數的元組給出了數組在每個維度上的大小,稱為數組的形狀。Numpy中的數組類稱為ndarray。Numpy數組中的元素可以使用方括號訪問,也可以使用嵌套Python列表初始化。Numpy中的數組可以通過多種方式創建,具有不同數量的秩,定義數組的大小。
  • Python:一篇文章掌握Numpy的基本用法
    本文主要內容如下:Numpy數組對象創建ndarray數組Numpy的數值類型ndarray數組的屬性ndarray數組的切片和索引處理數組形狀數組的類型轉換numpy常用統計函數數組的廣播1 Numpy數組對象Numpy中的多維數組稱為ndarray
  • Python從入門到精通- 什麼是NumPy? (上)
    機器學習之 Sklearn深度學習之 TensorFlow深度學習之 Keras深度學習之 PyTorch深度學習之 MXnetNumpy 是 Python 專門處理高維數組 (high dimensional array) 的計算的包,每次使用它遇到問題都會它的官網 (www.numpy.org).
  • Python數據科學Numpy基礎20問
    1、什麼是numpy?一言以蔽之,numpy是python中基於數組對象的科學計算庫。提煉關鍵字,可以得出numpy以下三大特點:2、如何安裝numpy?因為numpy是一個python庫,所以使用python包管理工具pip或者conda都可以安裝。