我在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 是第一轮的索引其中内部数组的元素等于最大值。
我该怎么做?提前谢谢。
答案 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