假设我有这样一个2d数组:
>>> s
array([[1, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 0, 1],
[0, 1, 0, 0]])(每一行都是某个特性的一个热编码)。我想取s的所有行,直到看到一个特定的向量为止。例如,如果我想获得([0, 0, 0, 1])之前的所有行,我希望得到:
>>> desired
array([[1, 0, 0, 0],
[0, 0, 1, 0]])有什么好的方法可以在朗皮或西亚诺这样做吗?我在网上的文档上找不到解决方案。
发布于 2017-05-05 22:55:06
方法#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
因为我们处理的是一个热编码数组,所以我们可以沿着2D输入数组的每一行使用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]])https://stackoverflow.com/questions/43814821
复制相似问题