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