b10*_*ard 32 python numpy scipy
我想得到一个匹配一行的二维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]])
Run Code Online (Sandbox Code Playgroud)
我想得到与行[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]))
Run Code Online (Sandbox Code Playgroud)
我想索引数组([3,15]).
Aar*_*all 45
您需要该np.where函数来获取索引:
>>> np.where((vals == (0, 1)).all(axis=1))
(array([ 3, 15]),)
Run Code Online (Sandbox Code Playgroud)
或者,正如文档所述:
如果只给出条件,则返回
condition.nonzero()
你可以直接调用.nonzero()返回的数组.all:
>>> (vals == (0, 1)).all(axis=1).nonzero()
(array([ 3, 15]),)
Run Code Online (Sandbox Code Playgroud)
解散:
>>> vals == (0, 1)
array([[ True, False],
[False, False],
...
[ True, False],
[False, False],
[False, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
并.all在该数组上调用该方法(with 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)
Run Code Online (Sandbox Code Playgroud)
并获得哪些索引True:
>>> np.where((vals == (0, 1)).all(axis=1))
(array([ 3, 15]),)
Run Code Online (Sandbox Code Playgroud)
要么
>>> (vals == (0, 1)).all(axis=1).nonzero()
(array([ 3, 15]),)
Run Code Online (Sandbox Code Playgroud)
我发现我的解决方案更具可读性,但正如unutbu指出的那样,以下内容可能更快,并返回相同的值(vals == (0, 1)).all(axis=1):
>>> (vals[:, 0] == 0) & (vals[:, 1] == 1)
Run Code Online (Sandbox Code Playgroud)
In [5]: np.where((vals[:,0] == 0) & (vals[:,1]==1))[0]
Out[5]: array([ 3, 15])
Run Code Online (Sandbox Code Playgroud)
我不确定为什么,但这明显快于
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26812 次 |
| 最近记录: |