英国365bet网址-365bet足球游戏-正版约彩365软件

简约 · 精致 · 专注内容

【Python】numpy数组索引

【Python】numpy数组索引

numpy数组索引是一个大话题,有很多种方式可以让你选中数据中的子集或者某个元素。主要有以下四种方式:

一,基础索引

在一维数组中,你可以使用中括号指定索引获取第i个值(从0开始计数),但是对于多维的数组,每个索引值对应的元素不再是一个数值,例如,在一个二维数组中,将得到一个以为数组。单个元素可以继续索引,或者传递一个索引的列表选择单个元素。

import numpy as np

arr = np.arange(9).reshape((3,3))

arr[0] # array([0, 1, 2])

arr[0][0] # 0

arr[0,0] # 0

这种方式获取的数据为原数组的视图,对于视图数值的修改,也会修改原数组数值。

二·,切片索引

numpy切片与Python列表的标准切片语法相同,通过切片可以灵活地得到一个子数组。与基础索引一样,切片索引也是原数组的视图,修改数据也会作用于原数组。

arr[:2,1:]

"""

array([[1, 2],

[4, 5]])

"""

切片索引有两个实用的应用:

1,获取数组的单行或者单列。

arr[0,:] # array([0, 1, 2]) 获取第1行

arr[:,0] # array([0, 3, 6]) 获取第1列

2,数组的逆序。

arr[::-1,::-1] # 对整个数组进行逆序

"""

array([[6, 7, 8],

[3, 4, 5],

[0, 1, 2]])

"""

arr[::-1,:] #行逆序

"""

array([[6, 7, 8],

[3, 4, 5],

[0, 1, 2]])

"""

arr[:,::-1] # 列逆序

"""

array([[2, 1, 0],

[5, 4, 3],

[8, 7, 6]])

"""

三,布尔索引

布尔索引主要是利用的布尔数组,当数组的比较操作(比如==、>=)也是可以向量化,这些比较运算的结果是一个布尔数据类型的数组。该数组与原数组的长度和形状都是一致,我们可以获取到对应位置为True的值。

bool_arr = arr>3

arr[bool_arr] # array([4, 5, 6, 7, 8])

通过布尔索引获得的子数组为副本,修改后不影响原数组。

arr = np.array([[0, 1, 2],

[3, 4, 5],

[6, 7, 8]])

arr2 = arr[ arr>3]

arr2 = -1

arr

"""

array([[0, 1, 2],

[3, 4, 5],

[6, 7, 8]])

"""

布尔数组操作

1,统计记录个数

如果需要统计布尔数组中True的个数,可以使用np.count_nonzero函数

np.count_nonzero(arr>3) # 5

另一种方法是使用np.sum,False会被解释为0,而True被解释为1。sum()可以沿着行或列求和。

np.sum(arr>3) # 5

#每一列中大于3的个数

np.sum(arr>3,axis=0) # array([1, 2, 2])

2,快速地检查是否包含True

np.all(arr>3) # False all 全部为True时,返回True,否则返回False

np.any(arr>3) # True any 至少有一个为True时,返回True,否则返回False

# np.all() 和 np.any()也可以沿着特定的轴。

np.all(arr>7,axis=0) # array([False, False, False])

np.any(arr>7,axis=0) # array([False, False, True])

3,python中的关键字and 和 or 对布尔数组不起作用,需要使用逐位逻辑运算符(&,|,^)

当使用 and 或者 or 时,就等于让python将整个数组当作布尔对象;

当使用 & 或者 | 时,表达式操作的是数组中的元素,每个元素逐位运算。

# 每个元素逐位逻辑运算

a = np.array([1,0,1,1,0],dtype=bool)

b = np.array([1,0,1,1,0],dtype=bool)

a & b # array([ True, False, True, True, False])

a = np.array([1,0,1,1,0],dtype=bool)

b = np.array([1,0,1,1,0],dtype=bool)

a and b

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

a and b 之所以报错,是因为,无法知道a和b整个数组,分别是Ture还是False。没法进行and运算,可以使用np.all() 或者 np.any()对整个数组进行判断。

a = np.array([1,0,1,1,0],dtype=bool)

b = np.array([1,0,1,1,0],dtype=bool)

np.all(a) and np.any(b) # False

四,数组索引

数组索引在概念上很简单,通过一个数组来一次性获取多个元素,

arr[[1,2]]

"""

array([[3, 4, 5],

[6, 7, 8]])

"""

arr[[1,2],[0,1]]

# array([3, 7]) 分别获取[1,0],[2,1]

在使用数组索引时,有两个点需要注意:

1,使用数组索引,结果的形状不是与被索引的数组的形状一致。

arr.shape # (3, 3)

ind = np.array([[0,2],[1,2]])

arr[ind].shape # (2, 2, 3)

2,操作重复的索引可以会产生一些出乎意料的结果。

x = np.zeros(10)

x[[0,0]] = [4,6]

上面的代码执行后,x的结果为array([6., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

这里会有疑问,4去哪里了?其实上面的代码等同于赋值两次。

A=1

A,A = 2,3

A # 3

A=2,然后A=3,所以最后结果为3。

继续设想以下操作:

x = np.zeros(10)

x[[0,0]] +=1

x[0] # 1

按照之前的想法,x[0]的输出结果应该的2,然而结果却是1。x[[0,0]] +=1其实可以拆开为:x[0],x[0] = x[0]+1,x[0]+1 ,换个简单的例子:

a = 1

a,a=a+1,a+1

print("a="+str(a))

a的结果为2,a,a=a+1,a+1的指向步骤是:

1,先计算等号右边的结果,(2,2)

2,将右边的结果赋给左边:a=2,a=2。

在看一个例子:

a = 1

b = 2

a,a=b,a+b

print("a="+str(a))

a的结果为3,a,a=b,a+b的指向步骤是:

1,先计算等号右边的结果,(2,3)

2,将右边的结果赋给左边:a=2,a=3。

numpy数组索引真的是一个大话题,可以引申出许多东西的,还可以将四种方式混合使用,只要知道每种方式的特点,混合使用也不是问题。如有错误,欢迎留言指出。

参考:《Python数据科学手册》

相关推荐

含有“鼠”的成语

含有“鼠”的成语

365bet足球游戏 07-26
十大福利手游app平台排行榜 哪个福利手游平台人气最高
苹果手机版本低微信装不上怎么办,详细教程说明
CDN图解(秒懂 + 史上最全)

CDN图解(秒懂 + 史上最全)

英国365bet网址 06-28
花生豆浆怎么做最好喝(打豆浆时多放一样,香浓顺滑)
《火影忍者手遊》醉拳李值得買嗎?醉拳李技能分析