从numpy.where()获取值的位置作为单个值并将其附加到另一个数组

时间:2018-04-04 05:48:15

标签: python arrays numpy indexing

我在numpy中创建了一个python数组:

a = [[1.         0.5        0.3 ... 0.71     0.72     0.73]
     [0.         0.4        0.6 ... 0.74     0.75     0.76]
     [0.         0.3        0.  ... 0.72     0.73     0.74]
                                ...
     [0.         0.2        0.3 ... 0.56     0.57     0.58]
     [0.         0.1        0.3 ... 0.67     0.68     0.69]]

和另一个数组

b = [[1.         0.5        0.6 ... 0.74     0.75     0.76]]

我从np.max(a, axis=0)得到的。现在我需要数组的索引,其中数组' a' 中的值等于' b' 中的对应值我使用过:

locn = []
for i in range(0, len(b[0])):
    for j in range(0, len(a)):
        fav = np.where(a[j][i] == b[0][j])
        locn.append(fav)
print(locn)

我得到输出为

[(array([0]),), (array([0]),), (array([0]),), (array([0]),), (array([], dtype=int64),), (array([], dtype=int64),), (array([], dtype=int64),), (array([], dtype=int64),), (array([0]),), (array([0]),), (array([0]),), (array([0]),), (array([], dtype=int64),), ............

我本可以使用 np.where(a == np.max(a))来获取最大位置,但这不是我的问题。我需要确切的位置(如第一个数组的第一个元素..或类似的东西)在loc []中追加数组的索引。例如:对于第一轮1是最高的,我只需将索引值0 附加到新列表locn []为0 是第一轮的索引其中内部数组的元素等于最大值。

我该怎么做?提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用函数argmax而不是最大值。例如

a = np.random.randint(10, size=(4, 5))
  

[
[8 9 6 4 7]
[6 4 0 3 6]
[7 5 9 1 6]
[1 4 8 8 9]

np.max(a, axis=0)
  

数组([8,9,9,8,9])

np.argmax(a, axis=0)
  

数组([0,0,2,3,3],dtype = int64)

如果您想以您描述的方式打印信息,那么您可以

b = np.argmax(a, axis=0)
print('locn'+str(b))
  

locn [0 0 2 3 3]

答案 1 :(得分:0)

即使查找元素不是最大值,但是例如随机选择,我们仍然可以在argmax上使用a==b

示例:

# generate random data
>>> n = 10
>>> a = np.round(np.random.random((n, n)), 1)
>>> a
array([[0.3, 0.2, 0.2, 0.4, 0.1, 0.6, 0.8, 0.9, 0.8, 0.1],
       [0.7, 1. , 0.1, 0.1, 0.4, 1. , 0.7, 0.8, 0.6, 0.5],
       [0.1, 0.5, 1. , 0.4, 0.6, 0.8, 0.9, 0.3, 0.2, 0.4],
       [0.2, 0.6, 0.2, 0. , 0.7, 0.8, 0.9, 0.6, 0. , 0.1],
       [0.4, 0. , 0.8, 0.2, 0.1, 0.8, 0.2, 0.6, 0.1, 0. ],
       [0.1, 0.2, 0.4, 0.4, 0. , 0.6, 0.6, 0.9, 0.6, 0.3],
       [0.9, 1. , 0.8, 0.8, 0.3, 0.5, 0.5, 0.2, 0.4, 0.7],
       [0.5, 0.5, 0.2, 0.8, 0.8, 0.1, 0.7, 0.5, 0.9, 0.5],
       [0. , 0.4, 0.5, 0.5, 0.6, 0.2, 0.5, 0.9, 0.6, 0.9],
       [0.8, 0.5, 0.1, 0.9, 0.7, 0.1, 0.8, 0. , 0.9, 0.8]])
# randomly pick an index each column
>>> choice = np.random.randint(0, n, (n,))
>>>
# retrieve values at chosen locations 
>>> b = a[choice, range(n)]
>>> b
array([0.4, 0.2, 0.8, 0.4, 0.6, 0.6, 0.8, 0.9, 0.6, 0.5])
>>> 
# now recover `choice`, or if the same as the chosen value occurs 
# earlier in that column return the index of the first occurrence.
>>> recover = np.argmax(a==b, axis=0)
>>> recover
array([4, 0, 4, 0, 2, 0, 0, 0, 1, 1])
>>>
# check result:
>>> recover <= choice
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True])
>>> a[recover, range(n)] == b
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True])

作为一个不错的小小的奖励,这可以利用max / argmax关于布尔值的短路(a==b,但仍在各地进行评估)这一事实:

>>> timeit('np.argmax(x)', globals={'np': np, 'x': np.ones(1000000, bool)}, number=100000)
0.10291801800121902
>>> timeit('np.argmax(x)', globals={'np': np, 'x': np.zeros(1000000, bool)}, number=100000)
4.172021539001435