numpy切片操作


numpy切片操作

一、總結

一句話總結:

numpy切片結構:array[start:stop:step,start:stop:step],前面的start:stop:step表示行,后面的start:stop:step表示列
arr1=np.arange(1,17).reshape((4,4))
print(arr1)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]

print(arr1[1:3,1::2])
[[ 6  8]
 [10 12]]

 

 

 

二、numpy數組切片操作之[:,2]、[-1:,0:2]、[1:,-1:]等都是啥?

轉自或參考:numpy數組切片操作之[:,2]、[-1:,0:2]、[1:,-1:]等都是啥?
https://blog.csdn.net/qq_41375609/article/details/95027651

注:最近在看代碼,有好多關於numpy庫的函數,尤其對於numpy數組,什么[:,2]、[-1:,0:2]、[1:,-1:]搞得一臉懵逼,百度沒找到解釋得很到位的,官網教程也也真是夠簡潔的。所以,還是得自己去實打實的敲一下,加強理解。

numpy數組切片操作

通過冒號分隔切片參數 start:stop:step 來進行切片操作:
形如:

b = a[2:7:2]   # 從索引 2 開始到索引 7 停止,間隔為 2

冒號 : 的解釋:如果只放置一個參數,如 [2],將返回與該索引相對應的單個元素。如果為 [2:],表示從該索引開始以后的所有項都將被提取。如果使用了兩個參數,如 [2:7],那么則提取兩個索引(不包括停止索引)之間的項。

一維數組

一維數組就如上所說,直接給例子看

>>>import numpy as np
>>>a = np.array([1,2,3,4,5,6,7,8])

1.只有一個參數

>>> a[1] #具體的元素 2
2
>>> a[1:] #冒號前面是起,后面是止,冒號前面空,指最小0,后面放空就是到最后,這里是一維數組
array([2, 3, 4, 5, 6, 7, 8])

對比一下下面這兩個,一個是一維數組,一個是具體的單個元素,為什么呢?看后面解釋。

>>> a[7:]
array([8])
>>> a[7]
8

2.兩個參數

>>> print(a[1:3])  #從索引1開始,也就是第二個元素2,到索引3,不包括索引3
[2 3]

3.三個參數

>>> print(a[1:7:2]) #從索引1開始,到索引7,不包括索引7,間隔為2
[2 4 6]

一維數組,很好理解,畢竟中括號[]里只有冒號,沒有逗號

二維數組

先定義一個二維數組

>>> import numpy as np
>>> a = np.array([[1,2,3],[3,4,5],[4,5,6]])
>>>print(a)
[[1 2 3]
 [3 4 5]
 [4 5 6]]
簡單:
>>> a[1]
array([3, 4, 5])

單個參數的話,就是指的是1,第二行或第二列。這里是行,因為行優先我猜。
所以就是第2行的元素

>>> a[1:]
array([[3, 4, 5],
      [4, 5, 6]])

出現了冒號,意思是從第二號到最后,這里指的也是行。冒號后面沒有數就是指最大的。冒號前面沒有數,就是指最小數0。如下

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

這里的意思就是,從0開始,到2,也就是第1行第二行。(第三行不算)

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

現在是兩個參數了,不過只有一個冒號,跟一維數組一樣,是從第二行到第三行,不包括第三行。

進階
>>> a[1,]
array([3, 4, 5])
>>> a[1:,]
array([[3, 4, 5],
      [4, 5, 6]])
>>> a[:2,]
array([[1, 2, 3],
      [3, 4, 5]])
>>> a[1:2,]
array([[3, 4, 5]])

跟上面三個對比一下,發現輸出一模一樣。

總結:

這是numpy的切片操作,一般結構如num[a:b,c:d],分析時以逗號為分隔符
逗號之前為要取的num行的下標范圍(a到b-1),逗號之后為要取的num列的下標范圍(c到d-1);
前面是行索引,后面是列索引
如果是這種num[:b,c:d],a的值未指定,那么a為最小值0;
如果是這種num[a:,c:d],b的值未指定,那么b為最大值;c、d的情況同理可得。

所以重點就是看逗號,沒逗號,就是看行了,冒號呢,就看成一維數組的形式啦。那上面逗號后面沒有樹,也就是不對列操作咯。
當然也可以這樣:

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

首先沒有逗號,那切片就是只看行了,這里的意思是,從0開始到2(2不算),間隔為1。

進階up

首先先把原數組再看一下。

>>> import numpy as np
>>> a = np.array([[1,2,3],[3,4,5],[4,5,6]])
>>>print(a)
[[1 2 3]
[3 4 5]
[4 5 6]]
>>> a[:,1]
array([2, 4, 5])

逗號前面是行,行都沒有指定數,也就是說對行每要求,只考慮列了。
這里的意思是:逗號之后是列,只有一個元素1,就是取第2列了。

>>> a[:,1:3]  #第2列到第3列
array([[2, 3],
      [4, 5],
      [5, 6]])
>>> a[:,0:2] #第1列到第2列
array([[1, 2],
      [3, 4],
      [4, 5]])
>>> a[:,]  #對列也不操作,跟下面等價
array([[1, 2, 3],
      [3, 4, 5],
      [4, 5, 6]])
>>> a[:,:]
array([[1, 2, 3],
      [3, 4, 5],
      [4, 5, 6]])

但是,下面的寫法是錯的!!! (就是逗號在最前面都是錯的)

>>> a[,1]
 File "<stdin>", line 1
   a[,1]
     ^
SyntaxError: invalid syntax
>>> a[,]
 File "<stdin>", line 1
   a[,]
     ^
SyntaxError: invalid syntax
>>> a[,:1]
 File "<stdin>", line 1
   a[,1]
     ^
SyntaxError: invalid syntax

到這,應該能基本看得懂所有的切片操作了吧!!!
但是,我們可能還會遇到負號,比如-1、-2…等這些。這些怎么理解呢
看下圖
在這里插入圖片描述
也就是說,-1就是指最后一個(行/列),依次遞推。

實戰一波
>>> a[:,-1]  #就是最后一列啦
array([3, 5, 6])
>>> a[:,-3:]  #倒3列,也就是這個數組的第一列,一直到最后。
array([[1, 2, 3],
      [3, 4, 5],
      [4, 5, 6]])
>>> a[:,-3:-1]  #倒3列,到倒1列,不包括倒一列。
array([[1, 2],
      [3, 4],
      [4, 5]])

其他行和列就都差不多啦

ok,現在看看稍微難理解的。

進階upup

對比一下下面兩個,發現他們的維度不同,一個是一維的,一個是二維的。
我們上面也遇到一個,一個是一維,一個是具體的單個元素。

>>> a[:,-1]
array([3, 5, 6])
>>> a[:,-1:]
array([[3],
      [5],
      [6]])

我的理解:

第一個是,指定了最后一列,也就是說,在二維數組里的一列,就是一維的啊。那么第二個,是從最后一列開始,不妨假設一下后面還有列,那么就應該是不止一列,對機器來說,就是二維的。機器肯定不知道什么時候是一維,什么時候是二維的,所以當你用到start和stop的時候,那就當作是二維的了。

我的建議:

官網給出的教程實在是太簡潔了。不夠詳細,所以啊,還是要自己動動手,就能很快明白numpy數組的切片操作了。

注;以上就是博主能想到的所以切片操作了吧,關於我的理解,如果有誤的話,還請大佬指出,共同學習呀。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM