我试图更好地理解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] 删除。
我来说两句