我试图做布尔索引 但..
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索引。相反,我问这次行动发生了什么?这是合法的吗?
答案 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
的花式索引,在此过程中你不会遇到任何颠簸。