Numpy Chain Indexing

时间:2017-04-21 16:16:23

标签: python numpy indexing

我正在努力更好地理解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]不起作用?

2 个答案:

答案 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,)数组,即中间数组第二维的大小。