如下帶你走進 @ 機器人時代
Discover 點選上面藍色文字,關注我們
NumPy中數組的切片和索引與list的操作類似:
import numpy as np
#一維數組切片
a = np.arange(12)
#生成切片對象
s = slice(1,10,2)
p=a[1:10:2]
q=a[3]
m=a[:9]
#從索引2開始到索引9停止,間隔時間為2
print(a[s])
print(a[p])
print(a[q])
print(a[m])
輸出結果:
[1 3 5 7 9]
[1 3 5 7 9]
3
[0 1 2 3 4 5 6 7 8]
下面我們來看看多元數組的操作:
s=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]])
print('列印全部\n',s[0:])
print('從第2行開始切\n',s[1:])
print('從第2行到第4行切出來,不含第4行\n',s[1:3])
輸出結果:
列印全部
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]]
從第2行開始切
[[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]]
從第2行到第4行切出來,不含第4行
[[4 5 6]
[7 8 9]]
還可以用...(省略号)來寫:
#多元數組的切片
s=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]])
print('列印全部\n',s[0:])
# print('從第2行開始切\n',s[1:])
# print('從第2行到第4行切出來,不含第4行\n',s[1:3])
print('列印第3列\n',s[...,2]) #列印第3列
print('列印第3行\n',s[2,...]) #列印第3行
print('列印第2列以後的全部\n',s[...,1:])
輸出結果:
列印全部
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]]
列印第3列
[ 3 6 9 12 15]
列印第3行
[7 8 9]
列印第2列以後的全部
[[ 2 3]
[ 5 6]
[ 8 9]
[11 12]
數組的索引除了以上方法外,還有整數數組索引、布爾索引及花式索引。
下面代碼展示了數組索引的方式:
s=np.array(
[[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12],
[13,14,15]
])
#擷取數組中 (0,0),(1,1) 和 (3,1) 位置處的元素
y = s[[0,1,3], [0,1,1]]
print (y)
#擷取數組中的四個角的元素
rows = np.array([[0,0],[4,4]])#行索引
cols = np.array([[0,2],[0,2]])#列索引
x = s[rows,cols]
print ('這個數組的四個角元素是:')
print (x)
輸出結果:
[ 1 5 11]
這個數組的四個角元素是:
[[ 1 3]
[13 15]]
使用...與:号進行切片:
d = np.array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
#對行列分别進行切片
e = d[1:4,1:3]
print('d[1:4,1:3]方法\n',e)
#行使用基礎索引,對列使用進階索引
f = d[1:4,[1,2]]
#顯示切片後結果
print ('d[1:4,[1,2]]方法\n',f)
#對行使用省略号
x=d[...,1:]
print('d[...,1:]方法\n',x)
輸出結果:
d[1:4,1:3]方法
[[ 4 5]
[ 7 8]
[10 11]]
d[1:4,[1,2]]方法
[[ 4 5]
[ 7 8]
[10 11]]
d[...,1:]方法
[[ 1 2]
[ 4 5]
[ 7 8]
[10 11]]
我們來看看布爾索引的方法:
#布爾索引
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print ('原數組是:')
print (x)
# 列印出大于 5 的元素
print ('大于 5 的元素是:\n')
print (x[x > 5])
#使用 ~(取補運算符)來過濾 NaN
print ('過濾掉是NaN的元素:\n')
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print (a[~np.isnan(a)])
#從數組中過濾掉非複數元素
print ('過濾掉不是複數的元素:')
a = np.array([1, 2+6j, 5, 3.5+5j])
print (a[np.iscomplex(a)])
輸出結果:
原數組是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
大于 5 的元素是:
[ 6 7 8 9 10 11]
過濾掉是NaN的元素:
[1. 2. 3. 4. 5.]
過濾掉是複數的元素:
[2. +6.j 3.5+5.j]
在多條件布爾索引的時候,如果條件是x[x>5 & x<10],運作時會報錯,解決辦法如下:
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('原數組:\n', x)
print('大于5且小于10的元素:')
print('條件加小括号:')
print(x[(x > 5) & (x < 10)])
print('使用np.logical_and方法:')
print(x[np.logical_and(x > 5, x < 10)])
print('使用np.all方法:')
print(x[np.all([x > 5, x < 10],axis=0)])
輸出結果:
原數組:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
大于5且小于10的元素:
條件加小括号:
[6 7 8 9]
使用np.logical_and方法:
[6 7 8 9]
使用np.all方法:
[6 7 8 9]
部分案例來自網絡,感謝網友的大力分享。
花式索引也可以了解為整數數組索引,但是它們之間又略有不同。
x=np.arange(32).reshape((8,4))
#生成8行4列的二維數組
print(x)
#分别對應 第4行資料、第2行資料
# 第1行資料、第7行資料項
print ('索引結果:\n',x[[4,2,1,7]])
#注意索引數組也是一個二維數組
輸出結果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
索引結果:
[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]
如果需要同時對列進行索引,要注意添加np.ix_:
x=np.arange(32).reshape((8,4))
# #生成8行4列的二維數組
=np.arange(32).reshape((8,4))
print (x[np.ix_([1,5,7,2],[0,3,1,2])])
輸出結果如下:
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
其中 [1,5,7,2] 代表行索引,而 [0,3,1,2] 表示與行索引相對應的列索引值,也就是行中的元素值會按照列索引值排序。比如,第一行元素,未排序前的順序是 [4,5,6,7],經過列索引排序後變成了 [4,7,5,6]。
np.ix_ 函數就是輸入兩個數組,産生笛卡爾積的映射關系。笛卡爾乘積是指在數學中,兩個集合 X 和 Y 的笛卡爾積(Cartesian product),又稱直積,表示為 X×Y,第一個對象是X的成員而第二個對象是 Y 的所有可能有序對的其中一個成員。
如果 np.xi_ 中輸入兩個清單,則第一個清單存的是待提取元素的行标,第二個清單存的是待提取元素的列标,第一個清單中的每個元素都會周遊第二個清單中的每個值,構成新矩陣的一行元素。
如果你在開發辦公室自動化程式時,操作excel表格資料時,這些索引方法就可以大派用場,讓你省去很多麻煩。
堅持學習,這樣每天都能進步一點點!!
往期回顧:
- 來來來,送你一個金牌銷售機器人,7X24小時不休,不要工資免費用!
- RPA技術在旅行社銷售業務中如何鳳凰涅槃??
- 【工資翻三倍】系列:一招搞定九宮圖檔切割機器人,讓你的朋友圈更加炫酷!
本文引用和摘錄相關内容,請聯系侵删。
- END -
最後,文章有幫助到你的話【點贊在看】
激勵我們分享更多的幹貨!