我对Python还是个新手.我正在阅读和测试Numpy官方文档中的代码.在第2.6.2部分(使用布尔数组进行索引)的末尾有一个返回奇怪答案的示例.不过,有趣的是,文档上写着"这是一件奇怪的事情".

a = np.arange(12).reshape(3, 4)
b1 = np.array([False, True, True])
b2 = np.array([True, False, True, False])
a[b1, b2]

我认为它应该返回以下答案(或类似的内容):

array([ 4, 6, 8, 10])

但它又回来了:

array([ 4, 10])

这是一张逻辑图.不知为何,我说错了吗? Logic Map

推荐答案

正如doctor 指出的那样,这是一件很奇怪的事情.

In practice, you would use different methods for each of the results that you want.

(见下文)

正如@Michael在 comments 中指出的那样,传递两个布尔数组会首先将它们转换为索引号:

a[b1, b2]

 |
 V

a[np.flatnonzero(b1), np.flatnonzero(b2)]

 |
 V

a[(array([1, 2]), array([0, 2]))]

也许它是以这种方式实现的(而不是a[np.ix_(b1, b2)]),类似于只有一个数组用于索引.例如,当您简单地执行a[b1]时,这可能发生在内部:a[np.flatnonzero(b1)].

对于多于1个的数组,这只是一个相同的机械师.


1.要获得预期yields ,请执行以下操作:

请参见this answer.在您的情况下,它将是:

a[b1][:, b2]

array([[ 4,  6],
       [ 8, 10]])

然后你就可以.flatten():

array([ 4,  6,  8, 10])

Or:

您可以使用np.ix_:

np.ix_(b1, b2) 产 a tuple of arrays:

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

可以用来获得相同的结果:

a[np.ix_(b1, b2)].flatten()

2. To get array([ 4, 10]) in a non-weird way:

明确使用integer array indexing:

a[[1, 2], [0, 2]]

Python相关问答推荐

如何处理嵌套的SON?

使用mySQL的SQlalchemy过滤重叠时间段

使用SciPy进行曲线匹配未能给出正确的匹配

try 与gemini-pro进行多轮聊天时出错

如何删除索引过go 的lexsort深度可能会影响性能?' &>

输出中带有南的亚麻神经网络

优化pytorch函数以消除for循环

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

如何获得每个组的时间戳差异?

将tdqm与cx.Oracle查询集成

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

如何在图中标记平均点?

如何并行化/加速并行numba代码?

Pandas Data Wrangling/Dataframe Assignment

Python—为什么我的代码返回一个TypeError

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

使用Python TCP套接字发送整数并使用C#接收—接收正确数据时出错

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

PYTHON中的pd.wide_to_long比较慢

在任何要保留的字段中添加引号的文件,就像在Pandas 中一样