Error using np.concatenate

Asked

Viewed 88 times

0

I’m doing a mergesort using numpy library. It turns out it’s giving error in the line "np.concatenate(result,left[i:])" there in the merge function. That is the mistake:

/sorts/main.py", line 30, in merge
np.concatenate(resultado,esquerda[i:])
TypeError: only integer scalar arrays can be converted to a scalar index

The complete code:

import numpy as np

def bubbleSort(lista,parametros):
    parametros[0] = 0
    parametros[1] = 0
    tamanho=lista.size-1
    for i in range(0,tamanho):
        for j in range(0,tamanho-i):
            if lista[j] > lista[j+1]:
                lista[j], lista[j+1] = lista[j+1], lista[j]
                parametros["trocas"]+=1
            parametros["comparacoes"]+=1

def merge(esquerda,direita,parametros):
    if not esquerda.size or not direita.size:
        parametros["comparacoes"] += 1
        return esquerda or direita
    resultado = np.array([])
    i, j = 0, 0
    while (resultado.size < esquerda.size + direita.size):
        if esquerda[i] < direita[j]:
            np.append(resultado,esquerda[i])
            i+= 1
            parametros["comparacoes"]+=1
        else:
            np.append(resultado,direita[j])
            j+= 1
            parametros["trocas"]+=1
        if i == esquerda.size:
            np.concatenate(resultado,esquerda[i:])
            parametros["comparacoes"] += 1
            break
        elif j == direita.size:
            np.concatenate(resultado,direita[:j])
            parametros["comparacoes"] += 2
            break
    return resultado

def mergeSort(lista,parametros):
    tamanho=lista.size
    if tamanho< 2:
        parametros["comparacoes"] += 1
        return lista
    meio = tamanho // 2
    esquerda = mergeSort(lista[:meio],parametros)
    direita = mergeSort(lista[meio:],parametros)
    return merge(esquerda, direita,parametros)




parametros={"trocas":0,"comparacoes":0}
lista=np.array([80,5,11,-23,1,12,4])# Vetor exemplo
print(lista)
bubbleSort(lista,parametros)
print(lista)
print("Trocas: ", parametros["trocas"], "\nComparacoes: ", parametros["comparacoes"])

lista=np.array([80,5,11,-23,1,12,4])# Vetor exemplo
parametros=[0,0]
lista=mergeSort(lista,parametros)
print(lista)
print("Trocas: ", parametros["trocas"], "\nComparacoes: ", parametros["comparacoes"])

1 answer

1

Replacing:

np.concatenate(resultado,esquerda[i:])
...
np.concatenate(resultado,direita[:j])

For:

np.concatenate([resultado,esquerda[i:]])
...
np.concatenate([resultado,direita[:j]])

...and with a few more minor modifications the thing would look like this:

import numpy as np

def bubbleSort(lista,parametros):
    tamanho=lista.size-1
    for i in range(0,tamanho):
        for j in range(0,tamanho-i):
            if lista[j] > lista[j+1]:
                lista[j], lista[j+1] = lista[j+1], lista[j]
                parametros["trocas"]+=1
            parametros["comparacoes"]+=1

def merge(esquerda,direita,parametros):
    if not esquerda.size or not direita.size:
        parametros["comparacoes"] += 1
        return esquerda or direita
    resultado = np.array([])
    i, j = 0, 0
    while (resultado.size < esquerda.size + direita.size):
        if esquerda[i] < direita[j]:
            np.append(resultado,esquerda[i])
            i+= 1
            parametros["comparacoes"]+=1
        else:
            np.append(resultado,direita[j])
            j+= 1
            parametros["trocas"]+=1
        if i == esquerda.size:
            np.concatenate([resultado,esquerda[i:]])
            parametros["comparacoes"] += 1
            break
        elif j == direita.size:
            np.concatenate([resultado,direita[:j]])
            parametros["comparacoes"] += 2
            break
    return resultado

def mergeSort(lista,parametros):
    tamanho=lista.size
    if tamanho< 2:
        parametros["comparacoes"] += 1
        return lista
    meio = tamanho // 2
    esquerda = mergeSort(lista[:meio],parametros)
    direita = mergeSort(lista[meio:],parametros)
    return merge(esquerda, direita,parametros)


lista=np.array([80,5,11,-23,1,12,4])# Vetor exemplo
parametros={ "trocas": 0, "comparacoes": 0 }
bubbleSort(lista,parametros)
print(lista)
print(parametros)

lista=np.array([80,5,11,-23,1,12,4])# Vetor exemplo
parametros={ "trocas": 0, "comparacoes": 0 }
lista=mergeSort(lista,parametros)
print(lista)
print(parametros)

Reference: https://stackoverflow.com/questions/9236926/concatenating-two-one-dimensional-numpy-arrays

Browser other questions tagged

You are not signed in. Login or sign up in order to post.