我是Python和NumPy的新手,我在NumPy中尝试使用布尔索引,遇到了这个令我困惑的事情:
import numpy as np
np.random.seed(0)
创建了一个7 x 4阵列:
data = np.random.rand(7, 4)
[[ 0.5488 0.7152 0.6028 0.5449]
[ 0.4237 0.6459 0.4376 0.8918]
[ 0.9637 0.3834 0.7917 0.5289]
[ 0.568 0.9256 0.071 0.0871]
[ 0.0202 0.8326 0.7782 0.87 ]
[ 0.9786 0.7992 0.4615 0.7805]
[ 0.1183 0.6399 0.1434 0.9447]]
创建一个布尔数组也是7 x 4:
bool_array =
([[True,False,False,True],
[True,False,False,True],
[True,False,False,True],
[True,False,False,True],
[True,False,False,True],
[True,False,False,True],
[True,False,False,True]])
bool_array = np.array(bool_array)
data[bool_array]
输出:
[ 0.5488 0.5449 0.4237 0.8918 0.9637 0.5289 0.568 0.0871 0.0202
0.87 0.9786 0.7805 0.1183 0.9447]
如何解释?我的理由如下:行数相同(即7)。对于每一行,' True'在0和3位置(即2个值)找到。因此,我最终得到一个1 x 14矩阵。我期待的是7 x 2矩阵。
有人可以澄清如何评估它是如何给出1 x 14矩阵的吗?
答案 0 :(得分:0)
Numpy没有先验的方法知道你的面具的BEGIN { require Module; Module::->VERSION(...); Module::->import(...) }
元素在哪里。纯粹是偶然的,你的选择在列中整齐排列。
要理解为什么结果被推进到一维数组中,想象一下如何处理每行中有两个选择但不总是来自同一列的情况。现在想象一下每行中选择的数量不同的情况,可能有些行完全为空。 Numpy必须能够始终如一地处理所有这些案件。它会慢很多,并且会根据面具的内容返回不同形状的数组而导致很多问题。
要选择所需的列,请使用适当的索引:
True
OR
a[:, ::3]