如果我有多个最小的数字并且想要两个索引,那么如何在python中找到数组中最小数字的索引?
我有一个数组,我想在其中找到最小元素的索引。我尝试过以下方法:如果我有多个最小的数字并且想要两个索引,那么如何在python中找到数组中最小数字的索引?,python,arrays,Python,Arrays,我有一个数组,我想在其中找到最小元素的索引。我尝试过以下方法: distance = [2,3,2,5,4,7,6] a = distance.index(min(distance)) 这将返回0,这是第一个最小距离的索引。但是,我希望找到所有这样的实例,0和2。在Python中如何实现这一点?使用np.where获取与给定值匹配的所有索引: import numpy as np distance = np.array([2,3,2,5,4,7,6]) np.where(distance
distance = [2,3,2,5,4,7,6]
a = distance.index(min(distance))
这将返回0,这是第一个最小距离的索引。但是,我希望找到所有这样的实例,0和2。在Python中如何实现这一点?使用np.where获取与给定值匹配的所有索引:
import numpy as np
distance = np.array([2,3,2,5,4,7,6])
np.where(distance == np.min(distance))[0]
Out[1]: array([0, 2])
随着阵列大小的增长,Numpy的性能优于其他方法:
TimeIt比较测试的结果,改编自以下代码
使用np.where获取与给定值匹配的所有索引:
import numpy as np
distance = np.array([2,3,2,5,4,7,6])
np.where(distance == np.min(distance))[0]
Out[1]: array([0, 2])
随着阵列大小的增长,Numpy的性能优于其他方法:
TimeIt比较测试的结果,改编自以下代码
如果条件成立,则可以枚举数组元素并提取其索引:
min_value = min(distance)
[i for i,n in enumerate(distance) if n==min_value]
#[0,2]
如果条件成立,则可以枚举数组元素并提取其索引:
min_value = min(distance)
[i for i,n in enumerate(distance) if n==min_value]
#[0,2]
您还可以执行下列操作:
您还可以执行下列操作:
我们可以使用一个临时dict来存储列表的索引,然后只从列表中获取距离的最小值。我们还将在这里使用一个简单的for循环,以便您能够一步一步地理解正在发生的事情
from collections import defaultdict
d = defaultdict(list) # a dictionary where every value is a list by default
for idx, num in enumerate(distance):
d[num].append(idx) # for each number append the value of the index
d.get(min(distance)) # fetch the indices of the min number from our dict
[0, 2]
我们可以使用一个临时dict来存储列表的索引,然后只从列表中获取距离的最小值。我们还将在这里使用一个简单的for循环,以便您能够一步一步地理解正在发生的事情
from collections import defaultdict
d = defaultdict(list) # a dictionary where every value is a list by default
for idx, num in enumerate(distance):
d[num].append(idx) # for each number append the value of the index
d.get(min(distance)) # fetch the indices of the min number from our dict
[0, 2]
令人惊讶的是,numpy的答案似乎是最慢的
更新:取决于输入列表的大小
import numpy as np
import timeit
from collections import defaultdict
def weird_function_so_bad_to_read(distance):
se = sorted(enumerate(distance), key=lambda x: x[1])
smallest_numb = se[0][1] # careful exceptions when list is empty
return [x for x in se if smallest_numb == x[1]]
# t1 = 1.8322973089525476
def pythonic_way(distance):
min_value = min(distance)
return [i for i, n in enumerate(distance) if n == min_value]
# t2 = 0.8458914929069579
def fastest_dont_even_have_to_measure(np_distance):
# np_distance = np.array([2, 3, 2, 5, 4, 7, 6])
min_v = np.min(np_distance)
return np.where(np_distance == min_v)[0]
# t3 = 4.247801031917334
def dd_answer_was_my_first_guess_too(distance):
d = defaultdict(list) # a dictionary where every value is a list by default
for idx, num in enumerate(distance):
d[num].append(idx) # for each number append the value of the index
return d.get(min(distance))
# t4 = 1.8876687170704827
def wrapper(func, *args, **kwargs):
def wrapped():
return func(*args, **kwargs)
return wrapped
distance = [2, 3, 2, 5, 4, 7, 6]
t1 = wrapper(weird_function_so_bad_to_read, distance)
t2 = wrapper(pythonic_way, distance)
t3 = wrapper(fastest_dont_even_have_to_measure, np.array(distance))
t4 = wrapper(dd_answer_was_my_first_guess_too, distance)
print(timeit.timeit(t1))
print(timeit.timeit(t2))
print(timeit.timeit(t3))
print(timeit.timeit(t4))
令人惊讶的是,numpy的答案似乎是最慢的
更新:取决于输入列表的大小
import numpy as np
import timeit
from collections import defaultdict
def weird_function_so_bad_to_read(distance):
se = sorted(enumerate(distance), key=lambda x: x[1])
smallest_numb = se[0][1] # careful exceptions when list is empty
return [x for x in se if smallest_numb == x[1]]
# t1 = 1.8322973089525476
def pythonic_way(distance):
min_value = min(distance)
return [i for i, n in enumerate(distance) if n == min_value]
# t2 = 0.8458914929069579
def fastest_dont_even_have_to_measure(np_distance):
# np_distance = np.array([2, 3, 2, 5, 4, 7, 6])
min_v = np.min(np_distance)
return np.where(np_distance == min_v)[0]
# t3 = 4.247801031917334
def dd_answer_was_my_first_guess_too(distance):
d = defaultdict(list) # a dictionary where every value is a list by default
for idx, num in enumerate(distance):
d[num].append(idx) # for each number append the value of the index
return d.get(min(distance))
# t4 = 1.8876687170704827
def wrapper(func, *args, **kwargs):
def wrapped():
return func(*args, **kwargs)
return wrapped
distance = [2, 3, 2, 5, 4, 7, 6]
t1 = wrapper(weird_function_so_bad_to_read, distance)
t2 = wrapper(pythonic_way, distance)
t3 = wrapper(fastest_dont_even_have_to_measure, np.array(distance))
t4 = wrapper(dd_answer_was_my_first_guess_too, distance)
print(timeit.timeit(t1))
print(timeit.timeit(t2))
print(timeit.timeit(t3))
print(timeit.timeit(t4))
获取最小的数字,然后线性迭代,获取该数字的所有索引。获取最小的数字,然后线性迭代,获取该数字的所有索引。这与我之前发布的答案有何不同?@DYZ我想我们两人同时发布了答案。或者你有什么理由认为我的答案来自你的?如果我转过身来问你同样的问题会怎么样?在你的两个答案中,计算每次迭代的最小值似乎都是浪费。这与我之前发布的答案有什么不同?@DYZ我想我们两个都是在同一时间发布了答案。或者你有什么理由认为我的答案来自你的?如果我转过身来问你同样的问题呢?在你的两个答案中,计算每次迭代的最小值似乎都是浪费。你为什么要计算每次迭代的最小值呢?@Yannicamann一点也不奇怪。我在发布答案之前进行了这些测试。NumPy不是一颗银弹。为什么每次迭代都要计算最小值?@YannicHamann一点也不奇怪。我在发布答案之前进行了这些测试。NumPy不是银弹,很有趣。我没想到会这样。我想知道为什么会是这样?当你将numpy.ndarray类型的距离与整数进行比较时,它总是计算整个数组。我认为这引出了一个重要的观点:numpy在非常大的数组的高效计算中大放异彩。正如您已经明确指出的,对于小型阵列,numpy可能不是最有效的。但是numpy比大多数其他方法更具可伸缩性。包含一些相关的解释。没问题。我在Excel中绘制了上面的绘图,因为它很快。我使用Matplotlib.interest重新绘制了绘图。我没想到会这样。我想知道为什么会是这样?当你将numpy.ndarray类型的距离与整数进行比较时,它总是计算整个数组。我认为这引出了一个重要的观点:numpy在非常大的数组的高效计算中大放异彩。正如您已经明确指出的,对于小型阵列,numpy可能不是最有效的。但是numpy比大多数其他方法更具可伸缩性。包含一些相关的解释。没问题。我在Excel中绘制了上面的绘图,因为它很快。我使用Matplotlib重新绘制了绘图。我使用您的代码运行了一些附加测试,这些测试显示了numpy在阵列大小急剧增加时的性能。我使用您的代码运行了一些附加测试,这些测试显示了numpy在阵列大小急剧增加时的性能。