#python #arrays #python-3.x #numpy-ndarray
#питон #массивы #python-3.x #numpy-ndarray
Вопрос:
Я только что создал простую функцию слияния, используя массив numpy. Код приведен ниже, и он должен быть довольно простым, правильно ли я реализую массив?
import numpy as np def Merge(leftlist, rightlist): len1 = len(leftlist) len2 = len(rightlist) lfirst = 0 rfirst = 0 merge = 0 newlist = np.empty(len1 len2, dtype = int) while lfirst lt; len1 and rfirst lt; len2: if leftlist[lfirst] lt; rightlist[rfirst]: newlist[merge] = leftlist[lfirst] lfirst = 1 merge = 1 else: newlist[merge] = rightlist[rfirst] rfirst = 1 merge = 1 return newlist
Когда я использую Слияние([5,6,9],[1,2,3]), он возвращается:
массив([ 1, 2, 3, 173670400, 1667330163, 1701601125]),
вместо массива([1,2,3,5,6,9]). Не знаю, что в этом плохого.
Редактировать: Я должен упомянуть, что параметры leftlist и rightlist в данном случае также являются массивами numpy.
Комментарии:
1. Почему бы просто
sorted(leftlist rightlist)
np.sort(np.concatenate((leftlist, rightlist)))
не указать, являются ли они списками или массивами numpy?2. это из
while lfirst lt; len1 and rfirst lt; len2
-за того , пересмотрите это3. вы должны выполнить два шага: объединить, а затем отсортировать, иначе сложность быстро исчезнет
Ответ №1:
При запуске Merge([5,6,9],[1,2,3])
значение lfirst
остается равным 0 , поэтому leftlist
оно никогда не считывается за пределами первого элемента (цикл while никогда не учитывает, что делать со списком с большим значением). Случайные элементы, которые вы видите, вызваны тем, что вы сначала создали пустой массив. Если вы будете запускать Merge([5,6,9],[1,2,3])
снова и снова, последние 3 элемента будут меняться каждый раз.
Я отредактировал вашу функцию, чтобы найти желаемый результат (N. B. Это сортируется только в том случае, если каждый переданный список уже отсортирован):
def Merge(left, right): leftlist, rightlist = [list(left), list(right)] comparisons = 0 newlist = [] while leftlist or rightlist: try: x = leftlist.pop(0) if leftlist[0] lt; rightlist[0] else rightlist.pop(0) except: x = leftlist.pop(0) if leftlist else rightlist.pop(0) newlist.append(x) comparisons = 1 return np.array(newlist), comparisons
Выход:
Merge([5,6,9],[1,2,3]) # (array([1, 2, 3, 5, 6, 9]), 6)
Итак, здесь было 6 сравнений.
Комментарии:
1. Извините @Manlai A , я должен был упомянуть, что параметры leftlist и rightlist являются массивами numpy, поэтому возврат отсортированных(leftlist rightlist) вернет числа в каждом индексе, сложенные вместе, верно?
2. @Очевидно, так просто
np.concatenate
иnp.sort
следует ли это делать?3. да, это было бы просто в чистом смысле сортировки, но мне нужно было бы реализовать это так, как я описал выше, чтобы затем я мог добавить счетчик, чтобы отслеживать каждое сравнение, выполненное для двух массивов numpy, что является моей конечной целью.
4. Я только что попробовал, и это работает так, как у вас было с Merge([5,6,9],[1,2,3]), но если списки перевернуты, это все равно выдает ошибку. « Объединить([1,2,3], [5,6,9]) «