如何获取np 2d数组的所有行直到某个向量

时间:2017-05-05 22:53:48

标签: arrays numpy slice

假设我有一个像这样的二维数组:

>>> s
array([[1, 0, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1],
       [0, 0, 0, 1],
       [0, 1, 0, 0]])

(每行是某个功能的热门编码)。我想看看所有的行直到看到一个特定的向量。例如,如果我想在([0, 0, 0, 1])之前获取所有行,我想得到:

>>> desired
array([[1, 0, 0, 0],
       [0, 0, 1, 0]])

在numpy或theano中有一个很好的方法吗?我无法在在线文档中找到解决方案。

1 个答案:

答案 0 :(得分:2)

方法#1

获得与您正在寻找的数组的相等性,为我们提供2D数组。然后,查找所有与.all(axis=1)匹配的行匹配,这将是1D布尔数组。最后,要获取匹配中的第一个实例,请使用.argmax()并沿着从开始到该索引的行对数组进行切片。

因此,完整的实施将是 -

s[:(s == [0,0,0,1]).all(1).argmax()]

逐步运行示例 -

In [39]: s  # Input array
Out[39]: 
array([[1, 0, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1],
       [0, 0, 0, 1],
       [0, 1, 0, 0]])

In [33]: s == [0,0,0,1] # compare against search array
Out[33]: 
array([[False,  True,  True, False],
       [ True,  True, False, False],
       [ True,  True,  True,  True],
       [ True,  True,  True,  True],
       [ True, False,  True, False]], dtype=bool)

In [34]: (s == [0,0,0,1]).all(1)
Out[34]: array([False, False,  True,  True, False], dtype=bool)

In [37]: (s == [0,0,0,1]).all(1).argmax()
Out[37]: 2

In [38]: s[:(s == [0,0,0,1]).all(1).argmax()]
Out[38]: 
array([[1, 0, 0, 0],
       [0, 0, 1, 0]])

方法#2

由于我们正在处理单热编码数组,因此我们可以在argmax输入数组的每一行使用2D,从而将其减少为1D数组。类似地,将搜索数组减少为标量,其余步骤保持不变。这对于内存有效,因为我们会避免创建一个2D布尔数组。让我们直接进入样本运行 -

In [89]: s.argmax(1)
Out[89]: array([0, 2, 3, 3, 1])

In [90]: np.argmax([0,0,0,1])
Out[90]: 3

In [91]: s.argmax(1) == np.argmax([0,0,0,1])
Out[91]: array([False, False,  True,  True, False], dtype=bool)

In [92]: (s.argmax(1) == np.argmax([0,0,0,1])).argmax()
Out[92]: 2

# Final code
In [93]: s[:(s.argmax(1) == np.argmax([0,0,0,1])).argmax()]
Out[93]: 
array([[1, 0, 0, 0],
       [0, 0, 1, 0]])