J'apprends donc numpy et dans ce livre, il y a une question qui me dit de créer trois tableaux Z, M et C. Dans mon tableau Z, je suis supposé créer un tableau dimensionnel (4,5) et mon tableau M est un tableau de masque booléen qui est de la même taille (4,5) mais est vrai où M = abs(Z) < 2 Mon tableau C est également de la même taille mais contient juste des nombres complexes C = np.full(Z.shape, (-0.4 + 0.6j), dtype=complex)

Maintenant, mes trois tableaux sont les suivants

[[2.23606798 1.41421356 1.         1.41421356 2.23606798]
 [2.02758751 1.05409255 0.33333333 1.05409255 2.02758751]
 [2.02758751 1.05409255 0.33333333 1.05409255 2.02758751]
 [2.23606798 1.41421356 1.         1.41421356 2.23606798]]

[[False  True  True  True False]
 [False  True  True  True False]
 [False  True  True  True False]
 [False  True  True  True False]]

[[-0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j]
 [-0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j]
 [-0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j]
 [-0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j]]

Modification de la faute de frappe de multiplier C à ajouter C

Voici ma question. Je suis supposé multiplier chaque élément de mon tableau Z par eux-mêmes, puis les ajouter par C où tous les éléments du tableau M sont vrais Alors j'utiliserais Z[M] Mais lorsque j'essaie de le multiplier, puisque le tableau Z se transforme en un tableau à 1 dimension, je ne sais pas comment s'y prendre. J'ai besoin que la forme de mon tableau soit la même, je veux juste augmenter les éléments Z où les éléments M sont vrais sans changer les dimensions du tableau Z

La sortie finale correcte pour le tableau Z devrait être celle du dos du livre

[[-2.        -1.j         -0.4       +2.6j        -1.4       +0.6j
  -0.4       -1.4j         2.        -1.j        ]
 [-2.        -0.33333333j  0.48888889+1.26666667j -0.51111111+0.6j
   0.48888889-0.06666667j  2.        -0.33333333j]
 [-2.        +0.33333333j  0.48888889-0.06666667j -0.51111111+0.6j
   0.48888889+1.26666667j  2.        +0.33333333j]
 [-2.        +1.j         -0.4       -1.4j        -1.4       +0.6j
  -0.4       +2.6j         2.        +1.j        ]]
1
John Baltimore 1 sept. 2020 à 01:37

4 réponses

Meilleure réponse

Votre tableau masqué doit être 1-D, car dans un masque général, il peut ne pas y avoir de valeurs True de forme rectangulaire. Pour faire une multiplication, utilisez simplement un masque sur chaque élément de votre calcul masqué:

Z[M]*Z[M]*C[M]

Production:

[-0.8       +1.2j        -0.4       +0.6j        -0.8       +1.2j
 -0.44444444+0.66666666j -0.04444444+0.06666667j -0.44444444+0.66666666j
 -0.44444444+0.66666666j -0.04444444+0.06666667j -0.44444444+0.66666666j
 -0.8       +1.2j        -0.4       +0.6j        -0.8       +1.2j       ]

Une autre approche consiste à utiliser MaskedArrays. Cela conservera la forme et ne masquera que les éléments False:

Z = np.ma.MaskedArray(Z,M)
C = np.ma.MaskedArray(C,M)
Z*Z*C

Production:

[[(-2.0000000044725126+3.000000006708768j) -- -- -- (-2.0000000044725126+3.000000006708768j)]
 [(-1.6444444442832002+2.4666666664248003j) -- -- -- (-1.6444444442832002+2.4666666664248003j)]
 [(-1.6444444442832002+2.4666666664248003j) -- -- -- (-1.6444444442832002+2.4666666664248003j)]
 [(-2.0000000044725126+3.000000006708768j) -- -- -- (-2.0000000044725126+3.000000006708768j)]]

MODIFIER : en fonction du commentaire OP, si vous souhaitez modifier les valeurs de Z uniquement là où M est True:

Z = Z.astype(complex)
Z[M] = Z[M]*Z[M]*C[M]

Production:

print(Z)
[[ 2.23606798+0.j         -0.8       +1.2j        -0.4       +0.6j        -0.8       +1.2j         2.23606798+0.j]
 [ 2.02758751+0.j         -0.44444444+0.66666666j -0.04444444+0.06666667j        -0.44444444+0.66666666j  2.02758751+0.j]
 [ 2.02758751+0.j         -0.44444444+0.66666666j -0.04444444+0.06666667j        -0.44444444+0.66666666j  2.02758751+0.j]
 [ 2.23606798+0.j         -0.8       +1.2j        -0.4       +0.6j        -0.8       +1.2j         2.23606798+0.j]]
0
Ehsan 31 août 2020 à 23:35

Comme votre exercice vous dit d'utiliser des masques, vous pouvez faire quelque chose comme ceci:

Z = 3j*np.random.rand(4,5) #Create array
M = abs(Z) < 2  #Create mask
C = np.full(Z.shape, (-0.4 + 0.6j), dtype=complex) #Create complex

Et puis l'opération que vous souhaitez faire:

Z[M] = Z[M]*Z[M]+C[M] 

Regardez que j'utilise le masque du côté droit ainsi que du côté gauche. Donc je dis à numpy quelque chose comme: "Aux indices en Z, signalés par ce masque, attribuez les produits des éléments de Z, Z et C, qui sont tous signalés par le même masque" ou quelque chose du genre.

0
aramirezreyes 31 août 2020 à 23:41

Pour appliquer une opération à " où tous les M éléments du tableau sont Vrai ", vous pouvez littéralement utiliser "where":

np.where(M, Z * Z * C, Z)

Pensez-y comme if M then Z * Z * C else Z sous stéroïdes.

0
DYZ 31 août 2020 à 23:11

IIUC, vous pouvez faire ceci: z * z * c * m

Dans m, toutes les valeurs False sont représentées par zéro et toutes les valeurs True sont représentées par une. Vous pouvez le voir par m * 1

0
jsmart 31 août 2020 à 22:49