有没有一种快速的方法来获取argwhere的输出在where格式的输出中?

让我向您展示我在用一些代码做什么:

In [123]: filter = np.where(scores[:,:,:,4,:] > 21000)

In [124]: filter
Out[124]:
(array([ 2,  2,  4,  4,  4,  4,  4,  4,  4,  4,  4, 23, 23, 23, 23, 23]),
 array([13, 13,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  5]),
 array([0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2]),
 array([44, 44,  0,  1,  2,  3,  6,  8, 12, 14, 22, 31, 58, 76, 82, 41]))

In [125]: filter2 = np.argwhere(scores[:,:,:,4,:] > 21000)

In [126]: filter2
Out[126]:
array([[ 2, 13,  0, 44],
       [ 2, 13,  1, 44],
       [ 4,  4,  3,  0],
       [ 4,  4,  3,  1],
       [ 4,  4,  3,  2],
       [ 4,  4,  3,  3],
       [ 4,  4,  3,  6],
       [ 4,  4,  3,  8],
       [ 4,  4,  3, 12],
       [ 4,  4,  3, 14],
       [ 4,  4,  3, 22],
       [23,  4,  2, 31],
       [23,  4,  2, 58],
       [23,  4,  2, 76],
       [23,  4,  2, 82],
       [23,  5,  2, 41]])

In [150]: scores[:,:,:,4,:][filter]
Out[150]:
array([ 21344.,  21344.,  24672.,  24672.,  24672.,  24672.,  25232.,
        25232.,  25232.,  25232.,  24672.,  21152.,  21152.,  21152.,
        21152.,  21344.], dtype=float16)

In [129]: filter2[np.argsort(scores[:,:,:,4,:][filter])]
Out[129]:
array([[23,  4,  2, 31],
       [23,  4,  2, 58],
       [23,  4,  2, 76],
       [23,  4,  2, 82],
       [ 2, 13,  0, 44],
       [ 2, 13,  1, 44],
       [23,  5,  2, 41],
       [ 4,  4,  3,  0],
       [ 4,  4,  3,  1],
       [ 4,  4,  3,  2],
       [ 4,  4,  3,  3],
       [ 4,  4,  3, 22],
       [ 4,  4,  3,  6],
       [ 4,  4,  3,  8],
       [ 4,  4,  3, 12],
       [ 4,  4,  3, 14]])


129是我想要的输出,因此我的代码可以运行,但是我试图使其尽可能快。我应该与filter2一起获得np.array(filter).transpose()吗?还有更好的东西吗?

编辑,尝试更清楚地表达它:我想要一个索引列表,这些索引按应用于数组时返回的值排序。为此,我需要np.where和np.argwhere的输出,我想知道从一个输出切换到另一个输出的最快方法是什么,或者是否还有另一种获得我的结果的方法。

最佳答案

查看argwhere的代码:

return transpose(asanyarray(a).nonzero())


where文档说:


  其中(条件,[x,y])
  如果仅给出condition,则返回condition.nonzero()


实际上,两者都使用a.nonzero()。一个按原样使用它,另一个对它进行转置。

In [933]: x=np.zeros((2,3),int)
In [934]: x[[0,1,0],[0,1,2]]=1
In [935]: x
Out[935]:
array([[1, 0, 1],
       [0, 1, 0]])

In [936]: x.nonzero()
Out[936]: (array([0, 0, 1], dtype=int32), array([0, 2, 1], dtype=int32))
In [937]: np.where(x)   # same as nonzero()
Out[937]: (array([0, 0, 1], dtype=int32), array([0, 2, 1], dtype=int32))
In [938]: np.argwhere(x)
Out[938]:
array([[0, 0],
       [0, 2],
       [1, 1]], dtype=int32)
In [939]: np.argwhere(x).T
Out[939]:
array([[0, 0, 1],
       [0, 2, 1]], dtype=int32)


argwhere().Twhere相同,只是在2d中而不是在元组中。

np.transpose(filter)np.array(filter).T看起来同样不错。对于大型数组,在nonzero中花费的时间比在这些转换上花费的时间大得多。

关于python - 从argwhere到哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35796513/

10-12 20:18