domingo, 19 de noviembre de 2017

Comparando datos en una matriz con Python

En esta pregunta de stackoverflow.com se requiere asistencia para comparar datos en una matriz con Python con el fin de seleccionar los rasgos comunes a las letras del abecedario. Para ello se puede hacer uso de un diccionario para asignar el código correspondiente al rasgo común.

Ya en el código, la matrix general se transpone para facilitar la selección de las letras y la sub matriz de letras se vuelve a transponer para facilitar la selección de los rasgos comunes. Los rasgos comunes se evaluan en una lista por comprensión de una sola línea (en el código siguiente se presenta en dos por razones de legilibilidad) y finalmente se imprimen por consola. El código completo se señala a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import numpy as np

letters = {'p':0, 't':1, 'tj':2, 'c':3, 'k':4, 'kw':5, 'q':6, 'G':7, 'h':8}

features = {0:'sonoro', 1:'sonorante', 2:'obstruyente', 3:'consonantal', 4:'plosiva',
            5:'continuante', 6:'nasal', 7:'labial', 8:'redondo', 9:'coronal', 
            10:'estridente', 11:'anterior', 12:'distribuido', 13:'lateral', 14:'dorsal', 
            15:'alto', 16:'posterior', 17:'bajo', 18:'Silabico', 19:'Retraido'}


matrix = [[0, 0, 0, 0, 0, 0, 0, 1, 0], #sonoro
          [0, 0, 0, 0, 0, 0, 0, 0, 0], #sonorante
          [1, 1, 1, 1, 1, 1, 1, 1, 0], #obstruyente
          [1, 1, 1, 1, 1, 1, 1, 1, 0], #consonantal
          [1, 1, 1, 1, 1, 1, 1, 1, 0], #plosiva
          [0, 0, 0, 0, 0, 0, 0, 0, 1], #continuante
          [0, 0, 0, 0, 0, 0, 0, 0, 0], #nasal
          [1, 0, 0, 0, 0, 1, 0, 0, 0], #labial
          [0, 0, 0, 0, 0, 1, 0, 0, 0], #redondo
          [0, 1, 1, 0, 0, 0, 0, 0, 0], #coronal
          [0, 0, 0, 0, 0, 0, 0, 0, 0], #estridente
          [1, 1, 0, 0, 0, 0, 0, 0, 0], #anterior
          [0, 0, 1, 1, 0, 0, 0, 0, 0], #distribuido
          [0, 0, 0, 0, 0, 0, 0, 0, 0], #lateral
          [0, 0, 0, 1, 1, 1, 1, 1, 0], #dorsal
          [0, 0, 0, 1, 1, 1, 0, 0, 0], #alto
          [0, 0, 0, 0, 1, 1, 1, 1, 0], #posterior
          [0, 0, 0, 0, 0, 0, 0, 0, 0], #bajo
          [0, 0, 0, 0, 0, 0, 0, 0, 0], #Silabico
          [0, 0, 0, 0, 1, 1, 1, 1, 0]] #Retraido

t_matrix = np.transpose(matrix)

selected_matrix = [ t_matrix[0],  #p
                    t_matrix[4],  #k
                    t_matrix[8] ] #h

t_selected_matrix = np.transpose(selected_matrix)

common_features = [ features[i] for i, list in enumerate(t_selected_matrix)
                      if all(x == list[0] for x in list) ]

for feature in common_features:
    print feature

Después de la ejecución se obtiene lo siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
sonoro
sonorante
nasal
redondo
coronal
estridente
distribuido
lateral
bajo
Silabico

que corresponde a lo esperado.

No hay comentarios: