Par exemple, j'ai ce tableau 2d:

[
    [
     0.0,
     0.24320757858085434,
     0.14893361727523413,
     0.29786723455046826,
     0.18838778030301612,
     0.12160378929042717
    ],
    [
     0.23717478210768014,
     0.0,
     0.16770789675478251,
     0.20539938644228997,
     0.25981195646349819,
     0.1299059782317491
    ],
    [
     0.21681956134183847,
     0.250361664212574,
     0.0,
     0.23178986094050727,
     0.16390018248131957,
     0.13712873102376066
    ],
    [
     0.2933749527592357,
     0.20744741852633861,
     0.15681550844086434,
     0.0,
     0.18554661183269694,
     0.15681550844086434
    ],
    [
     0.20305810393286577,
     0.28716752453162431,
     0.12135042758887897,
     0.20305810393286577,
     0.0,
     0.18536584001376513
    ],
    [
     0.17877693623386351,
     0.19584032147389943,
     0.13848001934394774,
     0.23407395508684939,
     0.25282876786143976,
     0.0
    ]
]

Ce qui donne des ensembles de probabilités. Comment puis-je trouver la meilleure probabilité de chaque ligne? Et existe-t-il également un moyen de trouver par exemple la 2ème, 3ème meilleure probabilité sans changer la position des éléments? Attention, je suis nouveau sur Python! Je vous remercie!

1
btloseltwin 15 avril 2018 à 16:36

3 réponses

Meilleure réponse

La solution {j {X0}} de @ jpp est probablement la voie à suivre, pour les raisons qu'ils ont données, mais si vous vouliez le faire à partir de python pur, vous pourriez faire ce qui suit:

#Get the maximum value for each list

[[max(i)] for i in my_list]

# [[0.29786723455046826], [0.2598119564634982], [0.250361664212574], 
# [0.2933749527592357], [0.2871675245316243], [0.25282876786143976]]

# Get the maximum 2 values for each list:

[sorted(i)[-2:] for i in my_list]

# Get the maximum 3 values for each list:

[sorted(i)[-3:] for i in my_list]

Etc. Notez que cela ne réorganisera pas la liste d'origine, car le tri se produit dans les sous-listes en cours de création dans le list comprehension

0
sacuL 15 avril 2018 à 13:58

Vous pouvez le faire facilement avec la bibliothèque tierce numpy. Créez d'abord un tableau numpy:

A = np.array([[0.0, 0.24320757858085434, 0.14893361727523413, 0.29786723455046826, 0.18838778030301612, 0.12160378929042717], [0.23717478210768014, 0.0, 0.16770789675478251, 0.20539938644228997, 0.25981195646349819, 0.1299059782317491], [0.21681956134183847, 0.250361664212574, 0.0, 0.23178986094050727, 0.16390018248131957, 0.13712873102376066], [0.2933749527592357, 0.20744741852633861, 0.15681550844086434, 0.0, 0.18554661183269694, 0.15681550844086434], [0.20305810393286577, 0.28716752453162431, 0.12135042758887897, 0.20305810393286577, 0.0, 0.18536584001376513], [0.17877693623386351, 0.19584032147389943, 0.13848001934394774, 0.23407395508684939, 0.25282876786143976, 0.0]])

Pour renvoyer le maximum de chaque ligne:

res = A.max(axis=1)

Pour la deuxième plus grande de chaque ligne, vous pouvez utiliser numpy.sort. Cela trie le long d'un axe (non en place) puis extrait le 2ème plus grand (via -2).

res = np.sort(A, axis=1)[:, -2]

Ce sont tous deux des calculs vectorisés . Vous pouvez effectuer ces calculs à l'aide de listes de listes, mais cela est déconseillé.

1
jpp 15 avril 2018 à 15:48

Vous pouvez d'abord trier chaque ligne par ordre décroissant, puis sélectionner le premier ou le deuxième plus grand élément en fonction de vos besoins.

a = [
    [
     0.0,
     0.24320757858085434,
     0.14893361727523413,
     0.29786723455046826,
     0.18838778030301612,
     0.12160378929042717
    ],
    [
     0.23717478210768014,
     0.0,
     0.16770789675478251,
     0.20539938644228997,
     0.25981195646349819,
     0.1299059782317491
    ],
    [
     0.21681956134183847,
     0.250361664212574,
     0.0,
     0.23178986094050727,
     0.16390018248131957,
     0.13712873102376066
    ]
]

for i in range(0, len(a)):
    a[i].sort(reverse=True)

print "1st Largests:"
for row in a:
    print "\t" + str(row[0])

print "2nd Largests:"
for row in a:
    print "\t" + str(row[1])

PS: si vous vous inquiétez de l'efficacité, ce que vous devez rechercher est le partitionnement. Les schémas de partitionnement de Lomuto et Hoare sont deux célèbres.

0
eneski 15 avril 2018 à 15:30