布尔索引,但结果是其他一些操作

时间:2014-06-25 13:46:27

标签: python numpy

我试图做布尔索引 但..

np.random.randn(8).reshape((4,2))
Out[11]: 
array([[-1.13058416,  1.08397186],
       [-1.2730122 ,  0.78306498],
       [-0.05370502, -1.16723298],
       [ 1.01750955, -0.95029671]])

a=np.random.randn(8).reshape((4,2))

a[[2==3,3==0,0==0,1!=1]]
Out[13]: 
array([[ 0.18235299, -2.53482367],
       [ 0.18235299, -2.53482367],
       [-1.03752809, -2.2790847 ],
       [ 0.18235299, -2.53482367]])

刚刚发生了什么? 我更像是Bool索引。这是什么操作? 我不是要求将此更正为Bool索引。相反,我问这次行动发生了什么?这是合法的吗?

1 个答案:

答案 0 :(得分:2)

很容易将ndarray视为已增强的list。数组上的广播和操作会自动扩展到这些操作中涉及的列表,因此您可以添加一个数组和一个广播兼容的形状列表,而numpy将不会尝试连接两者(因为它会尝试使用两个列表)。

一个巨大的(对我来说,令人困惑的)例外是fancy indexing。花哨的索引本身已经让我感到困惑(因为有人来自MATLAB),因为以下两个给出不同的结果很奇怪:

import numpy as np
A = np.random.rand(3,3)
A[0:1,0:1]
A[range(2),range(2)]

前者是切片操作,返回2乘2的子矩阵。后者是花式索引的一种情况,只返回一个包含A[0,0]A[1,1]的2元素数组。

您的问题与奇怪的事情有关:布尔值的列表和数组在用于花式索引时的行为有所不同。根据您的问题,考虑以下两个示例:

A = np.random.rand(4,2)
bool_index_list = [False, True, True, False]
bool_index_array = np.array(bool_index_list)
A[bool_index_list].shape
A[bool_index_array].shape

前者返回(4,2),后者(2,2)

在前一种情况下,由于索引是list,因此将布尔值转换为相应的整数,并将结果值[0,1,1,0]用作矩阵中的实际索引,返回[第一,第二,第二,第一行。

在后一种情况下,array的索引dtype=bool按照您的预期使用:它被用作掩码来忽略A的{​​{1}}行。 index是False

numpy release notes除其他外,表示

  

将来,布尔数组(如python bools列表)将始终被视为布尔索引,布尔标量(包括python True)将成为合法的布尔索引。

相应地,上面基于列表的索引案例在numpy 1.10.1中给出了以下警告:

  

FutureWarning:将来,boolean array-likes将作为布尔数组索引处理

所以对你的问题的简短回答是它是合法的,但不会持久。坚持基于ndarray的花式索引,在此过程中你不会遇到任何颠簸。