天天看點

資料分析和機器學習架構底層工具NumPy的數組操作-索引和切片

作者:RPA自動化

如下帶你走進 @ 機器人時代

Discover 點選上面藍色文字,關注我們

資料分析和機器學習架構底層工具NumPy的數組操作-索引和切片

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 -

最後,文章有幫助到你的話【點贊在看】

激勵我們分享更多的幹貨!

繼續閱讀