J'ai besoin d'aide pour mon projet. J'ai deux tableaux dans lesquels je dois multiplier les éléments de array1 pour chaque élément de array2.

As an example,

pop_i = [[1, 0, 1]
         [0, 0, 1]
         [1, 1, 0]]

r_q = [[3, 5, 2], [5, 4, 3], [5, 2, 2]] 

Ce que j'ai fait en premier, c'est d'arranger r_q pour qu'il devienne le tableau que je voulais.

# simply arranging the values by means of transposition or using zip
r_q = [[3, 5, 5], [5, 4, 2], [2, 3, 2]]

Ce que je dois faire maintenant, c'est multiplier les éléments de r_q avec chaque élément de pop_i, comme:

r_10 = [3, 5, 5] * [1, 0, 1]
r_11 = [3, 5, 5] * [0, 0, 1]
r_12 = [3, 5, 5] * [1, 1, 0]

r_20 = [5, 4, 2] * [1, 0, 1]
r_21 = [5, 4, 2] * [0, 0, 1]
r_22 = [5, 4, 2] * [1, 1, 0]

r_30 = [2, 3, 2] * [1, 0, 1]
r_31 = [2, 3, 2] * [0, 0, 1]
r_32 = [2, 3, 2] * [1, 1, 0]

Ensuite, récupérez leurs sommes.

# r_1_sum = [3*1 + 5*0 + 5*1, 3*0 + 5*0 + 5*1, 3*1 + 5*1 + 5*0] and so on...

r_1_sum = [8, 5, 8]
r_2_sum = [7, 2, 9]
r_3_sum = [4, 2, 5]

J'ai du mal à multiplier r_q avec chaque élément de pop_i. Jusqu'à présent, mon code ressemble à ceci:

def fitness_score(g, u):
   # arrange resource demand of r_q 
   result = numpy.array([lst for lst in zip(*r_q)])

   # multiply elements in r_q with each elements in pop_i
   for i in range(0, len(result)):
      multiplied_output = numpy.multiply(result[i], pop_i)
   print(multiplied_output)

   for x in in range(0, len(multiplied_output)):
      final = numpy.sum(multiplied_output[x])

Mais je continue à obtenir des réponses pour le dernier index de r_q. Je pense que la partie multiplication est fausse. Toute aide / suggestion serait très appréciée. Merci beaucoup!

2
Acee 4 juin 2020 à 10:53

3 réponses

Meilleure réponse

En supposant,

pop_i = [[1, 0, 1],[0, 0, 1],[1, 1, 0]]
r_q = [[3, 5, 2], [5, 4, 3], [5, 2, 2]] 

Utilisation:

matrix = []
for row in zip(*r_q):
    temp = []
    for col in zip(*pop_i):
        temp.append(sum([x*y for x, y in zip(row, col)]))
    matrix.append(temp)

r_1_sum, r_2_sum, r_3_sum = matrix

Ou, mieux vaut utiliser l'approche numpy,

import numpy as np

a1 = np.array(pop_i)
a2 = np.array(r_q)
a = a1 @ a2
r_1_sum, r_2_sum, r_3_sum = a.T.tolist()

Résultat:

[8, 5, 8] # r_1_sum
[7, 2, 9] # r_2_sum
[4, 2, 5] # r_3_sum
2
Shubham Sharma 4 juin 2020 à 09:43

Exemple de code à partir du lien pour référence:

# Program to multiply two matrices using nested loops
# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]
# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]
# result is 3x4
result = [[0,0,0,0],
         [0,0,0,0],
         [0,0,0,0]]

# iterate through rows of X
for i in range(len(X)):
   # iterate through columns of Y
   for j in range(len(Y[0])):
       # iterate through rows of Y
       for k in range(len(Y)):
           result[i][j] += X[i][k] * Y[k][j]

for r in result:
   print(r)

Vérifiez si ce lien vous aide: https://www.programiz.com/python -programmation / exemples / multiply-matrice. (Il n'a pas de réponse directe, mais utilise la même logique que vous essayez.)

-1
Adrian Mole 4 juin 2020 à 11:06

Vous pouvez obtenir le résultat souhaité en utilisant la fonction numpy dot.

import numpy as np

pop_i = np.array([[1, 0, 1],[0, 0, 1],[1, 1, 0]])

r_q = np.array([[3, 5, 2], [5, 4, 3], [5, 2, 2]])

result = np.dot(np.transpose(r_q), pop_i)

Reportez-vous à la documentation numpy.dot.

0
Mohit Khandelwal 4 juin 2020 à 08:15