[ Foro de Python ]

relacionar posiciones en listas

20-Nov-2017 18:05
Pedro Gómez-Calcerrada Tajuelo
4 Respuestas

Buenas tardes, me encuentro con el siguiente problema:
- Leer dos enteros, n y m.
- Leer un vector de n componentes (reales)
- Leer m vectores de n componentes cada uno y los guarde en una matriz.
- Escriba por pantalla el vector de los m vectores que esté más cerca del primero, usando la distancia Euclídea.
Practicamente he conseguido todo lo que pide, llegando hasta localizar la mínima distancia. Pero no soy capaz de relacionar la posición de esa mínima distancia con el vector de la matriz al que corresponde para imprimirlo. A ver si alguien puede darme alguna pista. Muchas gracias. El código que he hecho es este:


n = int(input())
m = int(input())

def leervector():
    vector=[float(x) for x in input().split()]
    return vector
def leervectores():
    matriz=[]
    for i in range(m):
        for j in range(n):
            vectores=[float(x) for x in input().split()]
            matriz.append(vectores)
            break
    return matriz

def matrizrestas(m,n):
    restas=[]
    for i in range (m):
        restas.append([0]*n)
        
    for i in range(m):
        for j in range(n):
            restas[i][j]+=matriz[i][j]-vector[j]
       
    return restas

def matrizcuadrados(m,n):
    cuadrados=[]
    for i in range(m):
        cuadrados.append([0]*n)
        
    for i in range(m):
        for j in range(n):
            cuadrados[i][j]+=restas[i][j]*restas[i][j]
    return cuadrados

def matrizsumas(m,n):
    sumatorio=[]
    for i in cuadrados:
        suma=0
        for j in i:
            suma=suma+j
        sumatorio.append(suma)
            
    return sumatorio

def matrizdistancias(m):
    distancias=[]
    for i in range(m):
        distancias.append(sumatorio[i]**0.5)
    return distancias

def distanciaminima(n,distancias):
    menordistancia=distancias[0]
    suma=0
    for i in distancias:
        suma=suma+i
        if menordistancia>i:
            menordistancia=i
    return menordistancia
       
vector = leervector()                            
matriz = leervectores()
print(matriz)
restas=matrizrestas(m,n)
print(restas)
cuadrados=matrizcuadrados(m,n)
print(cuadrados)
sumatorio=matrizsumas(m,n)
print(sumatorio)
distancias=matrizdistancias(m)
print (distancias)
menordistancia=distanciaminima(n,distancias)
print (menordistancia)




20-Nov-2017 23:01
Nacho Cabanes (+83)

La distancia euclídea no se calcula simplemente sumando: es la raíz de las sumas de las distancias entre cada componente al cuadrado:

https://es.wikipedia.org/wiki/Distancia_euclidiana

La lógica sería algo parecido a:


dist = distancia(vector 0, vector 1)
pos = 1
para todos los valores i de desde 2 hasta m
    dist2 = distancia(vector 0, vector i) 
    si (dist2 < dist) entonces dist = dist2, pos = i
escribir vector pos


 


23-Nov-2017 12:26
Pedro Gómez-Calcerrada Tajuelo

Muchas gracias Nacho. Por lo que comentas de la distancia Euclídea, sí que la tengo bien calculada. Primero realicé las restas dato a dato, después las elevé al cuadrado, posteriormente hice el sumatorio, y al final la raíz cuadrada, que son las operaciones que me dan las distancias de cada fila con el vector inicial. Eso lo hace bien, reportándome la distancia mínima correcta. El problema que tengo es que al final, por ejemplo, si el primer vector de la matriz es el más cercano, me reporta su distancia al vector inicial como distancia mínima, pero lo que no sé es cómo indicar para que desde esa distancia mínima que reporte al vector al que corresponde.
Voy a intentar introducir la idea que me has aportado a ver si soy capaz. Por que no ando muy ducho con este tema.

Vuelvo a agradecer el tiempo que me has dedicado. Un saludo


23-Nov-2017 15:51
Pedro Gómez-Calcerrada Tajuelo

Buenas tardes, problema resuelto. Solo me queda un pequeño arreglo, y que no se como hacer para que en el ultimo print, me salgan los componentes del vector sin corchetes y separados por espacios en banco. Mil gracias. Aqui dejo el codigo que funciona perfecto.


n = int(input())
m = int(input())

def leervector():
    vector=[float(x) for x in input().split()]
    return vector

def leervectores():
    matriz=[]
    for i in range(m):
        for j in range(n):
            vectores=[float(x) for x in input().split()]
            matriz.append(vectores)
            break
    return matriz

def matrizrestas(m,n):
    restas=[]
    for i in range (m):
        restas.append([0]*n)
    for i in range(m):
        for j in range(n):
            restas[i][j]+=matriz[i][j]-vector[j]
    return restas

def matrizcuadrados(m,n):
    cuadrados=[]
    for i in range(m):
        cuadrados.append([0]*n)
    for i in range(m):
        for j in range(n):
            cuadrados[i][j]+=restas[i][j]*restas[i][j]
    return cuadrados

def matrizsumas(m,n):
    sumatorio=[]
    for i in cuadrados:
        suma=0
        for j in i:
            suma=suma+j
        sumatorio.append(suma)
    return sumatorio

def matrizdistancias(m):
    distancias=[]
    for i in range(m):
        distancias.append(sumatorio[i]**0.5)
    return distancias

def vectorprox(m,n):
    menordistancia=distancias[0]
    pos=0
    for i in range (2,m):
        menordistancia2=distancias[i]
        if menordistancia2<menordistancia:
            menordistancia=menordistancia2
            pos=i
    return matriz[pos]

vector = leervector()
matriz = leervectores()
print(matriz)
restas=matrizrestas(m,n)
print(restas)
cuadrados=matrizcuadrados(m,n)
print(cuadrados)
sumatorio=matrizsumas(m,n)
print(sumatorio)
distancias=matrizdistancias(m)
print (distancias)
menordistancia=vectorprox(m,n)
print(menordistancia)


 


24-Nov-2017 11:16
Nacho Cabanes (+83)

Mostrar el contenido de un vector o una lista es fácil. La forma más simple es recorrer sus elementos con un "for", así:

lista = [10, 20, 30]

# Escribe [10, 20, 30]
print(lista)

# Escribe sin corchetes ni comas
for i in lista:
	print(i, end=' ')

 






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)