solve roots optimize opt mathematical python optimization matrix

python - roots - Encuentre índices de un valor en la matriz 2d



scipy optimize minimize in python (5)

Tengo una matriz de la forma,

mymatrix=[[1,2,3],[4,5,6],[7,8,9]]

Quiero obtener el índice de, digamos por ejemplo, 9 que está en (2,2).

Lo que he tratado de hacer hasta ahora.

for i,j in enumerate(mymatrix): for k,l in enumerate(j): if l==9: print i,k

¿Hay una mejor manera de hacer lo mismo? Optimización, ¿alguien? Gracias por adelantado.


Creo que puede encontrar útil, esclarecedor e incluso sorprendente lo siguiente:

Editar: Se movió el valor objetivo al centro de la matriz para simular la ubicación promedio si los datos son aleatorios y nivelan el campo de juego para los algoritmos que se detienen tan pronto como se encuentran.

También ejecutó sincronizaciones en Python 2 y 3 para comparar.

from __future__ import print_function import sys import timeit setup = """ mymatrix=[[1,2,3],[4,9,6],[7,8,5]] # moved target value to middle val = 9 """ statements = { "Anuk (OP)": """ # finds all occurrences found = [] for i,j in enumerate(mymatrix): for k,l in enumerate(j): if l==val: found.append((i,k)) """, "Ryan Haining": """ # only finds first occurrence in each row found = [(index, row.index(val)) for index, row in enumerate(mymatrix) if val in row] """, "martineau": """ # finds all occurrences width = len(mymatrix[0]) found = [] posn = 0 for row in mymatrix: for col in row: if col == val: found.append((posn // width, posn % width)) posn += 1 """, "martineau #2": """ # finds all occurrences width = len(mymatrix[0]) found = [(posn // width, posn % width) for posn,elem in enumerate(col for row in mymatrix for col in row) if elem == val] """, "mtahmed": """ # stops after it finds first occurrence matrix_dim = len(mymatrix[0]) item_index = 0 for row in mymatrix: for i in row: if i == val: break item_index += 1 if i == val: break found = [(int(item_index / matrix_dim), item_index % matrix_dim)] """, } N = 1000000 R = 3 timings = [ (idea, min(timeit.repeat(statements[idea], setup=setup, repeat=R, number=N)), ) for idea in statements] longest = max(len(t[0]) for t in timings) # length of longest name print(''fastest to slowest timings (Python {}.{}.{})/n''.format(*sys.version_info[:3]), '' ({:,d} executions, best of {:d})/n''.format(N, R)) ranked = sorted(timings, key=lambda t: t[1]) # sort by speed (fastest first) for timing in ranked: print("{:>{width}} : {:.6f} secs, rel speed {rel:>8.6f}x".format( timing[0], timing[1], rel=timing[1]/ranked[0][1], width=longest))

Muestra de salida:

fastest to slowest timings (Python 2.7.5) (1,000,000 executions, best of 3) mtahmed : 2.850508 secs, rel speed 1.000000x martineau : 3.684153 secs, rel speed 1.292455x Ryan Haining : 8.391357 secs, rel speed 2.943811x Anuk (OP) : 14.014551 secs, rel speed 4.916510x martineau #2 : 15.880949 secs, rel speed 5.571270x fastest to slowest timings (Python 3.3.2) (1,000,000 executions, best of 3) mtahmed : 5.019435 secs, rel speed 1.000000x martineau : 5.217747 secs, rel speed 1.039509x Ryan Haining : 5.705710 secs, rel speed 1.136723x Anuk (OP) : 8.317911 secs, rel speed 1.657141x martineau #2 : 11.590270 secs, rel speed 2.309078x


Puede hacer esto en lugar de usar enumerar. NO estoy seguro si esto es más rápido.

matrix = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]] needle = 9 matrix_dim = len(matrix[0]) item_index = 0 for row in matrix: for i in row: if i == needle: break item_index += 1 if i == needle: break print(int(item_index / matrix_dim), item_index % matrix_dim)

Esto tomará exactamente el tiempo i * dim(matrix) + (j+1) donde el resultado de lo anterior es ij que podría ser O(n^2) en el peor de los casos.


Si convierte mymatrix a una matriz numpy, puede usar numpy.where para devolver los índices:

>>> import numpy as np >>> mymatrix=[[1,2,3],[4,5,6],[7,8,9]] >>> a = np.array(mymatrix) >>> a array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> b = np.where(a==9) >>> b (array([2]), array([2])) >>> mymatrix=[[1,2,3],[9,5,6],[7,8,9]] >>> a = np.array(mymatrix) >>> a array([[1, 2, 3], [9, 5, 6], [7, 8, 9]]) >>> b = np.where(a==9) >>> b (array([1, 2]), array([0, 2]))


Si desea todas las ubicaciones en las que aparece el valor, puede usar la siguiente lista de comprensión con val set a lo que está buscando.

[(index, row.index(val)) for index, row in enumerate(mymatrix) if val in row]

por ejemplo:

>>> mymatrix=[[1,2,9],[4,9,6],[7,8,9]] >>> val = 9 >>> [(index, row.index(val)) for index, row in enumerate(mymatrix) if val in row] [(0, 2), (1, 1), (2, 2)]

EDITAR

No es realmente cierto que esto obtenga todas las ocurrencias, solo obtendrá la primera aparición del valor en una fila dada.


si desea encontrar el índice de todas las ocurrencias de un val o personaje en una lista 2d, este código puede ayudarlo y es legible. Tnq.

for i, e in enumerate(board): for j, ee in enumerate(e): if ''d'' in ee: print(i, j)

puedes encontrar múltiples ocurrencias también.