gpt4 book ai didi

python - 从 argwhere 到哪里?

转载 作者:行者123 更新时间:2023-11-30 22:59:20 25 4
gpt4 key购买 nike

是否有一种快速方法可以在 where 格式的输出中获取 argwhere 的输出?

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

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 是我想要的输出,所以我的代码可以工作,但我试图使其尽可能快。我应该使用 np.array(filter).transpose() 获取 filter2 吗?还有更好的吗?

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

最佳答案

查看argwhere的代码:

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

where 文档说:

where(condition, [x, y]) If only condition is given, return 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 相同,只不过是在二维而不是元组中。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com