我正在努力更好地理解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]
不起作用?
答案 0 :(得分:1)
但为什么这样,数据[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])
答案 1 :(得分:0)
我还没有看到名为'chaining'的2d numpy索引
data
是2d,因此可以用2元素元组索引
data[bools, 2:]
data([bools, slice(2,None,None))]
也可以表示为
data[bools,:][:,2:]
首先从行中选择,然后从列中选择。
请注意,您的索引会产生一个(2,1)数组; 2来自bool
中的True数,以及来自1
切片长度的2:
。
您使用[0]
的第二个索引实际上是行选择:
data[bools, 2:][0]
data[bools, 2:][0,:]
结果是(1,)数组,即中间数组第二维的大小。