Есть ли способ ускорить этот цикл Python? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть двумерный np-массив с числом столбцов, в 100 раз превышающим количество строк. Например, если количество строк равно 1000, количество столбцов равно 100 000, а значения являются целыми числами. Моя цель - вернуть 1000 уникальных целых чисел для каждого из 1000 индексов строк. Значения в столбце не все уникальны (могут быть дубликаты), и, следовательно, мне нужно просмотреть все значения в каждой строке, чтобы выбрать первое целочисленное значение в строке, которое еще не было выбрано в предыдущей операции. У меня есть этот воспроизводимый цикл, который отлично работает для меньших num_rows около ~ 1000. Но когда дело доходит до обработки более 10 000 строк, это мучительно медленно. Есть ли более эффективный способ справиться с этим?

import numpy as np
maxval = 5000
matrix = np.random.randint(maxval,size=(maxval, maxval*100))
neighbours = maxval - 1
indices = [] #this array will contain the outputs after the loop gets completed
for e in matrix:
    i = 0
    while i < neighbours:
        if e[i] in indices:
            i += 1
        else:
            indices.append(e[i])
            break 

Ответы [ 3 ]

2 голосов
/ 12 апреля 2019

Не простой способ, но если row имеет 100 000 элементов, то

import random

random.sample(set(row), 1000)

Это случайная выборка из 1000 уникальных элементов из него.

Примечания:

  • Если число встречается намного чаще, чем другое, у них все еще есть такая же вероятность выбора
  • Если число уникальных значений меньше 1000, это вызывает ValueError
  • Могу существовать просто эквивалент обоих, я не знаю
0 голосов
/ 12 апреля 2019

Использование словарей будет намного быстрее, но я не знаю, достаточно ли:

from collections import OrderedDict

indx = OrderedDict()

for e in matrix:
    i = 0
    while i < neighbours:
        v = e[i]
        if indx.get(v) is None:
            indx[v] = True
            break
        i += 1

results = list(indx.keys())

0 голосов
/ 12 апреля 2019

Вы можете использовать set вместо списка для поиска:

import numpy as np
maxval = 50
matrix = np.random.randint(maxval,size=(maxval, maxval*100))
neighbours = maxval - 1
indices = set() #this array will contain the outputs after the loop gets completed
for e in matrix:
    i = 0
    while i < neighbours:
        if e[i] in indices:
            i += 1
        else:
            indices.add(e[i])
            break 

Здесь у вас есть живой пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...