Выберите n значений из списка, охватывающего весь диапазон - PullRequest
0 голосов
/ 20 июня 2019

У меня есть список чисел, и я хотел бы выбрать n значений, равномерно распределенных по списку.

Например:

vals = list(range(10))
select_n(vals, 4)
select_n(vals, 5)

должно дать

[0, 3, 6, 9]
[0, 2, 5, 7, 9]

Мой текущий хак состоит в следующем:

[vals[round((len(vals) - 1)/(n-1) * i)] for i in range(n)]

Есть ли функция Python или NumPy для этого? Если нет, есть ли более эффективный способ написать это?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

вы можете использовать np.linspace для «тяжелого» подъема:

from operator import itemgetter

a = [*range(10)]

N = 5

# if tuple ok 
itemgetter(*np.linspace(0.5,len(a)-0.5,N,dtype=int))(a)
# (0, 2, 5, 7, 9)

# if must be list
[a[i] for i in np.linspace(0.5,len(a)-0.5,N,dtype=int)]
# [0, 2, 5, 7, 9]
0 голосов
/ 20 июня 2019

Вы можете сделать что-то вроде этого:

def select_n(vals,cnt):
    inc = int(len(vals)/cnt)
    # print(inc)
    res = [vals[i] for i in range(0,len(vals),inc)]
    # print(res)
    return res

vals = list(range(10))
# print(vals)
res = select_n(vals,4)
print(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...