国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

NumPy 基本切片和索引

lemon / 793人閱讀

摘要:有三種可用的索引字段訪問,基本切片,高級索引。基本切片和索引基本切片將的切片基本概念擴展到維。基本切片生成的所有數組始終是原始數組的視圖。序列切片的標準規則適用于基于每維的基本切片包括使用步驟索引。因此,在基本切片下的行為。

https://docs.scipy.org/doc/nu...

索引

ndarrays可以使用標準Python x[obj]語法對其進行索引 ,其中x是數組,obj是選擇方式。有三種可用的索引:字段訪問,基本切片,高級索引。究竟是哪一個取決于obj。

注意
在Python中,x[(exp1, exp2, ..., expN)]相當于 x[exp1, exp2, ..., expN]; 后者只是前者的語法糖。
基本切片和索引

基本切片將 Python 的切片基本概念擴展到 N 維。當obj是一個slice對象(由括號內的start:stop:step符號構造)、整數或切片對象和整數的元組時,會發生基本切片。也包括省略號(三個點)和newaxis對象。

從版本1.15.0開始不推薦使用:為了保持向后兼容Numeric中的常見用法,如果選擇對象是包含 slice 對象、省略號,或 newaxis 對象的任何非 nararray 和非元組序列(例如 list),則也會啟動基本切片,但不適用于整數數組或其他嵌入序列。

使用 N 個整數進行索引的最簡單情況返回表示相應項的數組標量。正如在 Python 中,所有下標是從零開始:對我個索引你,取值范圍為 $$ 0 le n_i < d_i $$ 其中d_i是 我的陣列的形狀的個元素。負指數被解釋為從數組的末尾開始計數(即,如果 n_i <0,則意味著n_i + d_i)。

基本切片生成的所有數組始終 是原始數組的視圖。

序列切片的標準規則適用于基于每維的基本切片(包括使用步驟索引)。要記住的一些有用的概念包括:

基本切片語法是i:j:k其中我是起始索引, j是停止索引,并且?是步驟 $$ k eq 0 $$ 。這將選擇米元件(在對應的尺寸)與索引值我,i,i+k,...,1 +(m - 1)k, 其中 $$ m = q +(r neq0)$$和 q 和 r 是通過j-i 除 k 所獲得的商和余數: $$ j - i = qk + r $$,因此 $$ i +(m - 1)k

>>>
>>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> x[1:7:2]
array([1, 3, 5])

負i和j被解釋為n + i和n + j,其中 n是相應維度中的元素數量。負k使得踩踏指向更小的指數。

>>>
>>> x[-2:10]
array([8, 9])
>>> x[-3:3:-1]
array([7, 6, 5, 4])

假設n是要切片的維度中的元素數。然后,如果我沒有給出其默認值為0 K> 0和 N - 1為?<0 。如果沒有給出j,則對于k> 0 ,默認為n ; 對于k <0,默認為-n-1。如果沒有給出k,則默認為1.注意, 與此相同,表示沿此軸選擇所有索引。:::

>>>
>>> x[5:]
array([5, 6, 7, 8, 9])

如果選擇元組中的對象數小于 N,則:假定任何后續維。

>>>
>>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> x.shape
(2, 3, 1)
>>> x[1:2]
array([[[4],
        [5],
        [6]]])

Ellipsis擴展為:制作與長度相同的選擇元組所需的對象數x.ndim??赡苤淮嬖谝粋€省略號。

>>>
>>> x[...,0]
array([[1, 2, 3],
       [4, 5, 6]])

newaxis選擇元組中的每個對象用于將所得選擇的維度擴展一個單位長度維度。添加的維度是newaxis 對象在選擇元組中的位置。

>>>
>>> x[:,np.newaxis,:,:].shape
(2, 1, 3, 1)

整數i返回相同的值,i:i+1 除了返回的對象的維度減少1.特別是,具有第p個元素的整數(和所有其他條目:)的選擇元組返回具有維度的相應子數組N - 1。如果N = 1, 則返回的對象是數組標量。Scalars中解釋了這些對象。

如果選擇元組具有:除作為切片對象的第p個條目之外的 所有條目i:j:k,則返回的數組具有通過連接由元素i,i + k,...,i +的整數索引返回的子數組形成的維N. m - 1)k

:切片元組中具有多個非條目的基本切片,就像使用單個非:條目重復應用切片一樣,其中:連續地獲取非條目(所有其他非:條目被替換:)。因此, 在基本切片下的x[ind1,...,ind2,:]行為xind1。

警告
對于高級索引,上述情況并非如此。

您可以使用切片來設置數組中的值,但是(與列表不同)您永遠不會增長數組。要設置的值的大小 必須(可廣播)為與其相同的形狀 。x[obj] = valuex[obj]

注意
請記住,切片元組總是可以構造為obj 并在x[obj]符號中使用??梢栽跇嬙熘惺褂们衅瑢ο髞泶鎇start:stop:step] 符號。例如,x[1:10:5,::-1]也可以實現為。這對于構造適用于任意維數組的通用代碼非常有用。obj = (slice(1,10,5), slice(None,None,-1)); x[obj]

numpy.newaxis
該newaxis對象可用于所有切片操作,以創建長度為1的軸。newaxis是"None"的別名,"None"可以用來代替相同的結果。

高級索引

當選擇對象obj是非元組序列對象,ndarray(數據類型為整數或bool)或具有至少一個序列對象或ndarray(數據類型為integer或bool)的元組時,將觸發高級索引。高級索引有兩種類型:整數和布爾值。

高級索引始終返回數據的副本(與返回視圖的基本切片形成對比)。

警告

高級索引的定義意味著x[(1,2,3),]根本不同于x[(1,2,3)]。后者相當于x[1,2,3]觸發基本選擇,而前者將觸發高級索引。一定要明白為什么會這樣。

同時認識到x[[1,2,3]]將觸發高級索引,而由于上面提到的不推薦的數字兼容性, x[[1,2,slice(None)]]將觸發基本切片。

整數數組索引

整數數組索引允許根據數組的N維索引選擇數組中的任意項。每個整數數組表示該維度的許多索引。

純整數數組索引

當索引包含盡可能多的整數數組時,索引的數組具有維度,索引是直接的,但與切片不同。

高級索引始終作為一個廣播和迭代:

result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M],
                           ..., ind_N[i_1, ..., i_M]]

請注意,結果形狀與(廣播)索引數組形狀相同。ind_1, ..., ind_N


從每一行開始,應選擇一個特定元素。行索引是just ,列索引指定要為相應行選擇的元素。將兩者結合使用可以使用高級索引解決任務:0, 1, 2

>>>
>>> x = np.array([[1, 2], [3, 4], [5, 6]])
>>> x[[0, 1, 2], [0, 1, 0]]
array([1, 4, 5])

為了實現類似于上面的基本切片的行為,可以使用廣播。該功能ix_可以幫助這種廣播。通過示例可以最好地理解這一點。


從4x3陣列中,應使用高級索引選擇角元素。因此,列是其中之一的所有元素和行是需要選擇的行。要使用高級索引,需要明確選擇所有元素。使用前面解釋的方法可以寫:0, 2

>>>
>>> x = array([[ 0,  1,  2],
...            [ 3,  4,  5],
...            [ 6,  7,  8],
...            [ 9, 10, 11]])
>>> rows = np.array([[0, 0],
...                  [3, 3]], dtype=np.intp)
>>> columns = np.array([[0, 2],
...                     [0, 2]], dtype=np.intp)
>>> x[rows, columns]
array([[ 0,  2],
       [ 9, 11]])

但是,由于上面的索引數組只是重復自身,因此可以使用廣播(比較諸如此類的操作 )來簡化:rows[:, np.newaxis] + columns

>>>
>>> rows = np.array([0, 3], dtype=np.intp)
>>> columns = np.array([0, 2], dtype=np.intp)
>>> rows[:, np.newaxis]
array([[0],
       [3]])
>>> x[rows[:, np.newaxis], columns]
array([[ 0,  2],
       [ 9, 11]])

這種廣播也可以使用以下功能實現ix_:

>>>
>>> x[np.ix_(rows, columns)]
array([[ 0,  2],
       [ 9, 11]])

請注意,如果沒有np.ix_調用,只會選擇對角線元素,如上例所示。對于使用多個高級索引進行索引,這個差異是最重要的。

結合高級索引和基本索引
當至少有一個slice(:),省略號(...)或newaxis 索引(或者數組的維度多于高級索引)時,行為可能會更復雜。這就像連接每個高級索引元素的索引結果一樣

在最簡單的情況下,只有一個單一的指標先進。單個高級索引可以例如替換切片,并且結果數組將是相同的,但是,它是副本并且可以具有不同的存儲器布局。當可能時,切片是優選的。

>>>
>>> x[1:2, 1:3]
array([[4, 5]])
>>> x[1:2, [1, 2]]
array([[4, 5]])

了解情況的最簡單方法可能是考慮結果形狀。索引操作分為兩部分,即由基本索引(不包括整數)定義的子空間和來自高級索引部分的子空間。需要區分兩種索引組合:

高級索引由切片分隔,Ellipsis或newaxis。例如。x[arr1, :, arr2]
高級索引彼此相鄰。例如但不是 因為在這方面是一個高級索引。x[..., arr1, arr2, :] x[arr1, :, 1]1
在第一種情況下,高級索引操作產生的維度首先出現在結果數組中,然后是子空間維度。在第二種情況下,高級索引操作的維度將插入到結果數組中與初始數組中相同的位置(后一種邏輯使簡單的高級索引行為就像切片一樣)。


假設x.shape為(10,20,30)并且ind是(2,3,4)形索引intp數組,則其形狀為(10,2,3,4,30),因為(20,)形子空間已被替換具有(2,3,4)形的廣播索引子空間。如果我們讓i,j,k循環遍及(2,3,4)形子空間 。此示例產生的結果與。result = x[...,ind,:]result[...,i,j,k,:] = x[...,ind[i,j,k],:]x.take(ind, axis=-2)


設x.shape(10,20,30,40,50)并假設ind_1 并ind_2可以廣播到形狀(2,3,4)。然后 x[:,ind_1,ind_2]具有形狀(10,2,3,4,40,50),因為來自X的(20,30)形子空間已經被索引的(2,3,4)子空間替換。但是,它 x[:,ind_1,:,ind_2]具有形狀(2,3,4,10,30,50),因為在索引子空間中沒有明確的位置,所以它在開頭就被添加了。始終可以使用 .transpose()在任何需要的位置移動子空間。請注意,此示例無法使用復制take。

布爾數組索引

當obj是布爾類型的數組對象時,會發生此高級索引,例如可能從比較運算符返回。x[obj.nonzero()]如上所述,單個布爾索引數組實際上與obj.nonzero()返回obj.ndim顯示objTrue元素的整數索引數組的元組(長度)相同。但是,它更快。obj.shape == x.shape

如果,返回一個1維數組,該數組填充了與obj 值對應的x元素。搜索順序為行主,C風格。如果物鏡具有在該外側是的邊界的條目值X,則索引錯誤將被提高。如果obj小于x,則與填充它相同。obj.ndim == x.ndimx[obj]TrueTrueFalse


一個常見的用例是過濾所需的元素值。例如,可能希望從陣列中選擇非NaN的所有條目:

>>>
>>> x = np.array([[1., 2.], [np.nan, 3.], [np.nan, np.nan]])
>>> x[~np.isnan(x)]
array([ 1.,  2.,  3.])

或者希望為所有負面元素添加常量:

>>>
>>> x = np.array([1., -1., -2., 3])
>>> x[x < 0] += 20
>>> x
array([  1.,  19.,  18.,   3.])

通常,如果索引包括布爾數組,則結果將與插入obj.nonzero()相同位置并使用上述整數數組索引機制相同。 相當于 。x[ind_1, boolean_array, ind_2]x[(ind_1,) + boolean_array.nonzero() + (ind_2,)]

如果只有一個布爾數組且沒有整數索引數組,則這是直截了當的。必須注意確保布爾索引具有與其應該使用的維度完全相同的維度。


從數組中,選擇總和小于或等于2的所有行:

>>>
>>> x = np.array([[0, 1], [1, 1], [2, 2]])
>>> rowsum = x.sum(-1)
>>> x[rowsum <= 2, :]
array([[0, 1],
       [1, 1]])

但如果rowsum還有兩個維度:

>>>
>>> rowsum = x.sum(-1, keepdims=True)
>>> rowsum.shape
(3, 1)
>>> x[rowsum <= 2, :]    # fails
IndexError: too many indices
>>> x[rowsum <= 2]
array([0, 1])

由于額外的維度,最后一個只給出了第一個元素。比較rowsum.nonzero()以了解此示例。

通過obj.nonzero()類比可以最好地理解組合多個布爾索引數組或布爾與整數索引數組 。該函數ix_ 還支持布爾數組,并且可以毫無意外地工作。


使用布爾索引選擇加起來為偶數的所有行。同時,應使用高級整數索引選擇列0和2。使用該ix_功能可以通過以下方式完成:

>>>
>>> x = array([[ 0,  1,  2],
...            [ 3,  4,  5],
...            [ 6,  7,  8],
...            [ 9, 10, 11]])
>>> rows = (x.sum(-1) % 2) == 0
>>> rows
array([False,  True, False,  True])
>>> columns = [0, 2]
>>> x[np.ix_(rows, columns)]
array([[ 3,  5],
       [ 9, 11]])

沒有np.ix_呼叫或只選擇對角線元素。

或者沒有np.ix_(比較整數數組示例):

>>>
>>> rows = rows.nonzero()[0]
>>> x[rows[:, np.newaxis], columns]
array([[ 3,  5],
       [ 9, 11]])
詳細說明

這些是一些詳細的注釋,對于日常索引(無特定順序)并不重要:

本機NumPy索引類型intp可能與默認的整數數組類型不同。intp是足以安全索引任何數組的最小數據類型; 對于高級索引,它可能比其他類型更快。
對于高級分配,通常不保證迭代順序。這意味著如果元素設置不止一次,則無法預測最終結果。
空(元組)索引是零維數組的完整標量索引。 如果是零維則x[()]返回標量,否則返回x視圖。另一方面,x[...]總是返回一個視圖。
如果索引中存在零維數組并且它是完整的整數索引,則結果將是標量而不是零維數組。(不會觸發高級索引。)
當存在省略號(...)但沒有大小(即替換為零 :)時,結果仍將始終為數組。如果沒有高級索引,則為視圖,否則為副本。
nonzero布爾數組的等價性不適用于零維布爾數組。
當高級索引操作的結果沒有元素但單個索引超出范圍時,是否IndexError引發了未定義(例如,超出范圍)。x[[], [123]]123
當在賦值期間發生轉換錯誤時(例如,使用字符串序列更新數值數組),被分配的數組可能最終處于不可預測的部分更新狀態。但是,如果發生任何其他錯誤(例如超出范圍索引),則陣列將保持不變。
高級索引結果的內存布局針對每個索引操作進行了優化,并且不能假設特定的內存順序。
當使用一個子類(尤其是其操縱它的形狀),默認ndarray.__setitem__行為會調用__getitem__的 基本索引而不是先進的索引。對于這樣的子類,最好ndarray.__setitem__使用基類 ndarray視圖調用數據。如果子類不返回視圖,則必須執行此操作__getitem__。
現場訪問
也可以看看
數據類型對象(dtype),標量

如果ndarray對象是結構化數組 ,則可以通過使用字符串索引數組來訪問數組的字段,類似于字典。

索引x["field-name"]返回數組的新視圖,該視圖與x具有相同的形狀(當字段是子數組時除外)但是數據類型x.dtype["field-name"]并且僅包含指定字段中的部分數據。還 記錄陣列標量可以被“索引”這種方式。

索引到結構化數組也可以使用字段名稱列表來完成, 例如 x[["field-name1","field-name2"]]。從NumPy 1.16開始,這將返回僅包含這些字段的視圖。在舊版本的numpy中它返回了一個副本。有關多字段索引的詳細信息,請參閱結構化陣列的用戶指南部分。

如果訪問的字段是子數組,則子數組的尺寸將附加到結果的形狀。

>>>
>>> x = np.zeros((2,2), dtype=[("a", np.int32), ("b", np.float64, (3,3))])
>>> x["a"].shape
(2, 2)
>>> x["a"].dtype
dtype("int32")
>>> x["b"].shape
(2, 2, 3, 3)
>>> x["b"].dtype
dtype("float64")
Flat Iterator索引

x.flat返回一個迭代器,它將遍歷整個數組(以C-contiguous樣式,最后一個索引變化最快)。只要選擇對象不是元組,也可以使用基本切片或高級索引對此迭代器對象建立索引。這應該從x.flat一維視圖的事實中清楚。它可以用于具有1維C風格平面索引的整數索引。因此,任何返回數組的形狀都是整數索引對象的形狀。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43660.html

相關文章

  • Numpy 中文用戶指南 2. 快速啟動

    摘要:注意和標準庫類并不相同,后者只處理一維數組和提供少量功能。然而,指定參數你可以吧運算應用到數組指定的軸上通用函數提供常見的數學函數如和。在中,這些叫作通用函數。函數,另一方面,將一維數組以行組合成二維數組。 原文:Quickstart tutorial 譯者:Reverland 來源:試驗性NumPy教程(譯) 2.1 先決條件 在閱讀這個教程之前,你多少需要知道點python。如...

    shiina 評論0 收藏0
  • Numpy數組的索引切片變形拼接分裂

    摘要:一一維數組的索引與切片對象的內容可以通過索引或切片來訪問和修改,與中的切片操作一樣。在指定位置分裂數組本身作為一個參數,分類位置構成的列表作為第二個參數同時也可以對一維數組和多位數組進行操作。 1.概述 今天我們來講一下Numpy數組的索引與切片,numpy數組的索引與切片和Python中的切片與索引的作用相同,可以快速的取出數據,進行下一步的運用或者查看,但是兩種切片還有一些不同的地...

    miracledan 評論0 收藏0
  • 【數據科學系統學習】Python # 數據分析基本操作[一] numpy

    摘要:提供了使我們能夠快速便捷地處理結構化數據的大量數據結構和函數。結構化數據,例如多維數據矩陣表格行數據,其中各列可能是不同的類型字符串數值日期等?;A數組和矢量計算高性能科學計算和數據分析的基礎包。 本篇內容為整理《利用Python進行數據分析》,博主使用代碼為 Python3,部分內容和書本有出入。 利用 Python 進行科學計算的實用指南。本書重點介紹了用于高效解決各種數據分析問...

    wushuiyong 評論0 收藏0
  • 【數據科學系統學習】Python # 數據分析基本操作[二] pandas

    摘要:中面向行和面向列的操作基本是平衡的。用層次化索引,將其表示為更高維度的數據。使用浮點值表示浮點和非浮點數組中的缺失數據。索引的的格式化輸出形式選取數據子集在內層中進行選取層次化索引在數據重塑和基于分組的操作中很重要。 我們在上一篇介紹了 NumPy,本篇介紹 pandas。 pandas入門 Pandas 是基于Numpy構建的,讓以NumPy為中心的應用變的更加簡單。 pandas...

    jayzou 評論0 收藏0
  • python數學建模是加深NumpyPandas學習

      小編寫這篇文章的主要目的,主要是來給大家去做一個介紹的,介紹的內容主要還是涉及到python的一些相關事情,比如我們可以利用python去進行搭建數字建模的相關平臺。其中,主要的內容有加深Numpy和Pandas的相關學習,具體內容,下面給大家詳細解答下?! umpy學習  #Numpy的基本使用   '''   Numpy提供了兩種基本的對象:ndarray存儲單一...

    89542767 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<