【发布时间】:2017-02-01 06:25:41
【问题描述】:
我可以理解以下 numpy 行为。
>>> a
array([[ 0. , 0. , 0. ],
[ 0. , 0.7, 0. ],
[ 0. , 0.3, 0.5],
[ 0.6, 0. , 0.8],
[ 0.7, 0. , 0. ]])
>>> argmax_overlaps = a.argmax(axis=1)
>>> argmax_overlaps
array([0, 1, 2, 2, 0])
>>> max_overlaps = a[np.arange(5),argmax_overlaps]
>>> max_overlaps
array([ 0. , 0.7, 0.5, 0.8, 0.7])
>>> gt_argmax_overlaps = a.argmax(axis=0)
>>> gt_argmax_overlaps
array([4, 1, 3])
>>> gt_max_overlaps = a[gt_argmax_overlaps,np.arange(a.shape[1])]
>>> gt_max_overlaps
array([ 0.7, 0.7, 0.8])
>>> gt_argmax_overlaps = np.where(a == gt_max_overlaps)
>>> gt_argmax_overlaps
(array([1, 3, 4]), array([1, 2, 0]))
我知道 0.7, 0.7 和 0.8 是 a[1,1],a[3,2] 和 a[4,0] 所以我得到了元组 (array[1,3,4] and array[1,2,0]) 每个数组由第 0 个和第一个索引组成这三个要素。然后我尝试了其他示例,以查看我的理解是否正确。
>>> np.where(a == [0.3])
(array([2]), array([1]))
0.3 在 a[2,1] 中,所以结果看起来和我预期的一样。然后我尝试了
>>> np.where(a == [0.3, 0.5])
(array([], dtype=int64),)
??我希望看到 (array([2,2]),array([2,3]))。为什么我会看到上面的输出?
>>> np.where(a == [0.7, 0.7, 0.8])
(array([1, 3, 4]), array([1, 2, 0]))
>>> np.where(a == [0.8,0.7,0.7])
(array([1]), array([1]))
我也无法理解第二个结果。有人可以向我解释一下吗?谢谢。
【问题讨论】:
-
使用
np.where((a==0.3)|(a==0.5))和np.where((a==0.7)|(a==0.8))获得正确的结果。但是我不知道为什么np.where(a == [0.7, 0.7, 0.8])有效,而np.where(a==[0.7,0.8])抛出DeprecationWarning。看起来像一个错误。 -
当
where给出意外索引时,查看条件数组。where只是告诉你该数组在哪里True。