NumPy布尔索引

445 阅读4分钟

你可以从一个NumPy 数组中索引特定的值,使用另一个NumPy数组的布尔值在一个轴上指定你要访问的索引。例如,要访问数组a = np.array([4, 6, 8]) 的第二个和第三个值,你可以使用布尔数组作为索引掩码的表达式a[np.array([False, True, True])]

一维布尔索引实例

下面是一个一维NumPy数组的最小例子。

import numpy as np


# 1D Boolean Indexing
a = np.array([4, 6, 8])
b = np.array([False, True, True])
print(a[b])
'''
[6 8]
'''

二维布尔索引实例

这里还有一个二维数组的最小例子。

# 2D Boolean Indexing
a = np.array([[1, 2, 3],
              [4, 5, 6]])
b = np.array([[True, False, False],
              [False, False, True]])
print(a[b])
'''
[6 8]
[1 6]
'''

让我们深入了解另一个例子。请看下面的代码片断。

import numpy as np


a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

indices = np.array([[False, False, True],
                    [False, False, False],
                    [True, True, False]])

print(a[indices])
# [3 7 8]

我们创建了两个数组aindices

  • 第一个数组包含二维数值数据--你可以把它看作是数据数组。
  • 第二个数组具有相同的形状,包含布尔值--把它看作是索引数组。

NumPy的一个很大的特点是,你可以 使用布尔数组作为索引方案来访问第二个数组中的特定值.通俗地说,我们从数据数组中创建一个新的NumPy数组,只包含那些索引数组在相应数组位置包含True 布尔值的元素。因此,生成的数组包含3、7和8三个值。

Python单行代码示例布尔索引

在下面的 单行本中,你将使用这个功能进行微型社会网络分析。

我们正在研究以下问题:"找到拥有超过1亿粉丝的Instagram超级明星的名字!"

## Dependencies
import numpy as np


## Data: popular Instagram accounts (millions followers)
inst = np.array([[232, "@instagram"],
                 [133, "@selenagomez"],
                 [59,  "@victoriassecret"],
                 [120, "@cristiano"],
                 [111, "@beyonce"],
                 [76,  "@nike"]])


## One-liner
superstars = inst[inst[:,0].astype(float) > 100, 1]


## Results
print(superstars)

你可以在脑子里计算出这个单行本的结果,不是吗?

数据由一个二维数组组成,每一行代表一个Instagram影响者。第一列是他们的粉丝数量(以百万计),第二列是他们的Instagram名称。问题是要找到拥有超过1亿粉丝的Instagram影响者的名字。

下面的单行线是解决这个问题的一种方法。请注意,还有很多其他的方法--这只是我发现的字符数最少的一种。

## One-liner
superstars = inst[inst[:,0].astype(float) > 100, 1]

让我们一步一步地解构这个单行代码。

首先,我们计算出一个布尔值,即每个有影响力的人是否拥有超过1亿的粉丝。

print(inst[:,0].astype(float) > 100)
# [ True  True False  True  True False]

数据数组的第一列包含粉丝数量,所以我们使用切片来访问这个数据(inst[:,0] ,返回所有行,但只返回第一列)。然而,数据数组包含混合数据类型(整数和字符串)。因此,NumPy自动给数组分配了一个非数字的数据类型。

但是由于我们要对数据数组的第一列进行数值比较(检查每个值是否大于100),我们首先需要将数组转换为数值类型(例如float)。

在这一点上,我们检查NumPy的float 类型的数组是否大于整数值。这里到底发生了什么?你已经了解了广播的情况。NumPy自动将两个操作数带入相同的形状。然后,它对这两个相同形状的数组进行元素比较。其结果是一个布尔值的数组。有四个有影响力的人拥有超过1亿的粉丝。

我们现在把这个布尔数组作为一个索引数组来选择拥有超过1亿粉丝的影响者(行)。

inst[inst[:,0].astype(float) > 100, 1]

由于我们只对这些有影响力的人的名字感兴趣,我们选择第二行作为最终结果存储在superstars变量中。

拥有超过1亿名Instagram粉丝的影响者是。

# ['@instagram' '@selenagomez' '@cristiano' '@beyonce']

下一步是什么?

学习NumPy不仅会让你成为一个更好的Python程序员,也会提高你作为数据科学家找到有利可图的职位和解决现实世界重要问题的机会。

为了帮助你提高你在市场上的价值,我写了一本新的NumPy书--100%基于基于谜题学习的成熟原则。

The postNumPy Boolean Indexingfirst appeared onFinxter.