优秀的编程知识分享平台

网站首页 > 技术文章 正文

数据分析和机器学习框架底层工具NumPy的数组操作-索引和切片

nanyue 2024-09-15 23:23:03 技术文章 4 ℃

如下带你走进 @ 机器人时代

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 -


最后,文章有帮助到你的话点赞在看
励我们分享更多的干货!

Tags:

最近发表
标签列表