Numpy 链索引

gold_cy

我试图更好地理解numpy并遇到一些我在索引方面不太理解的东西。

假设我们有第一个随机数组 booleans

bools = np.random.choice([True, False],(7),p=[0.5,0.5])

array([False,  True, False, False,  True, False, False], dtype=bool)

然后假设我们有从正态分布中选择的第二个随机数数组

data = np.random.randn(7,3)

array([[ 2.24116809, -0.41761776, -0.69026077],
       [-0.85450123,  0.98218741,  0.0233551 ],
       [-1.3157436 , -0.79753471,  1.77393444],
       [-0.26672724, -0.9532758 ,  0.67114247],
       [-1.34177843,  1.220083  , -0.35341168],
       [ 0.49629327,  1.73943962,  0.59050431],
       [ 0.01609382,  0.91396293,  0.3754827 ]])

使用numpy链索引我可以做到这一点

data[bools, 2:]

array([[ 0.0233551 ],
       [-0.35341168]])

现在假设我想简单地获取第一个元素,我可以这样做

data[bools, 2:][0]

array([ 0.0233551])

但为什么这data[bools, 2:, 0]行不通呢?

迪瓦卡尔

但是为什么这个 data[bools, 2:, 0] 不起作用?

因为输入是一个2D数组,因此您没有三个维度可以使用诸如 : 之类的东西[bools, 2:, 0]

为了实现您想要做的事情,您可以存储True与掩码中的索引相对应的索引bools,然后将其作为整体或其中的一个元素用于索引。

一个示例运行,使事情清楚 -

输入:

In [40]: data
Out[40]: 
array([[ 1.02429045,  1.74104271, -0.54634826],
       [-0.48451969,  0.83455196,  1.94444857],
       [ 0.66504345,  0.41821317,  2.52517305],
       [ 2.11428982, -0.05769528,  0.84432614],
       [ 0.9251009 , -0.74646199, -0.93573164],
       [ 0.07321257, -0.10708067,  1.78107884],
       [-0.12961046, -0.5787856 ,  0.2189466 ]])

In [41]: bools
Out[41]: array([ True,  True, False, False, False, False,  True], dtype=bool)

存储有效索引:

In [42]: idx = np.flatnonzero(bools)

In [43]: idx
Out[43]: array([0, 1, 6])

用作整体或其第一个元素:

In [44]: data[idx, 2:] # Same as data[bools, 2:]
Out[44]: 
array([[-0.54634826],
       [ 1.94444857],
       [ 0.2189466 ]])

In [45]: data[idx[0], 2:]
Out[45]: array([-0.54634826])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章