假设我有一个像这样的二维数组:
>>> 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中有一个很好的方法吗?我无法在在线文档中找到解决方案。
答案 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]])