Почему моя функция слияния дает странные ответы?

#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]) «