我想获得与行匹配的2维Numpy数组的索引。例如,我的数组是:
vals = np.array([[0, 0],
[1, 0],
[2, 0],
[0, 1],
[1, 1],
[2, 1],
[0, 2],
[1, 2],
[2, 2],
[0, 3],
[1, 3],
[2, 3],
[0, 0],
[1, 0],
[2, 0],
[0, 1],
[1, 1],
[2, 1],
[0, 2],
[1, 2],
[2, 2],
[0, 3],
[1, 3],
[2, 3]])
我想获得与行[0,1]匹配的索引,即索引3和15.当我执行类似numpy.where(vals == [0 ,1])
的操作时,我得到...
(array([ 0, 3, 3, 4, 5, 6, 9, 12, 15, 15, 16, 17, 18, 21]), array([0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0]))
我想索引数组([3,15])。
答案 0 :(得分:37)
您需要np.where
函数来获取索引:
>>> np.where((vals == (0, 1)).all(axis=1))
(array([ 3, 15]),)
或者,正如文档所述:
如果仅给出条件,请返回
condition.nonzero()
您可以直接在.all
返回的数组上调用.nonzero()
:
>>> (vals == (0, 1)).all(axis=1).nonzero()
(array([ 3, 15]),)
解散:
>>> vals == (0, 1)
array([[ True, False],
[False, False],
...
[ True, False],
[False, False],
[False, False]], dtype=bool)
并在该数组上调用.all
方法(使用axis=1
)会为您提供True
,其中两者都为True:
>>> (vals == (0, 1)).all(axis=1)
array([False, False, False, True, False, False, False, False, False,
False, False, False, False, False, False, True, False, False,
False, False, False, False, False, False], dtype=bool)
并获取哪些索引为True
:
>>> np.where((vals == (0, 1)).all(axis=1))
(array([ 3, 15]),)
或
>>> (vals == (0, 1)).all(axis=1).nonzero()
(array([ 3, 15]),)
我发现我的解决方案更具可读性,但正如unutbu指出的那样,以下内容可能更快,并返回与(vals == (0, 1)).all(axis=1)
相同的值:
>>> (vals[:, 0] == 0) & (vals[:, 1] == 1)
答案 1 :(得分:5)
In [5]: np.where((vals[:,0] == 0) & (vals[:,1]==1))[0]
Out[5]: array([ 3, 15])
我不知道为什么,但这明显快于
np.where((vals == (0, 1)).all(axis=1))
:
In [34]: vals2 = np.tile(vals, (1000,1))
In [35]: %timeit np.where((vals2 == (0, 1)).all(axis=1))[0]
1000 loops, best of 3: 808 µs per loop
In [36]: %timeit np.where((vals2[:,0] == 0) & (vals2[:,1]==1))[0]
10000 loops, best of 3: 152 µs per loop
答案 2 :(得分:3)
使用numpy_indexed包,您只需编写:
import numpy_indexed as npi
print(np.flatnonzero(npi.contains([[0, 1]], vals)))
答案 3 :(得分:0)
我相信numpy_indexed软件包可以使文档更加清晰,因此我们可以看到如何最好地使用它。上面的npi.contains示例看起来像我可以立即使用的东西。 我有一个整数A的M X 2数组和一个整数B的N X 2数组。 我想创建一个包含B的索引的M X 1数组C,其中A [indxA,0]&A [indxA,1] == B [indxB,0]&B [indxB,1]。 C的其他元素= -1。 我当时以为npi.contains可以工作,但是在github站点上找不到足够的信息来确定它是否可以,如果可以,我应该如何使用它。