Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我有多个最小的数字并且想要两个索引,那么如何在python中找到数组中最小数字的索引?_Python_Arrays - Fatal编程技术网

如果我有多个最小的数字并且想要两个索引,那么如何在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在阵列大小急剧增加时的性能。