2
votes

Comment utiliser un tableau booléen numpy pour modifier un autre tableau numpy?

J'ai un tableau booléen qui ressemble à ceci:

np.array(
[[0, 0, 0]
[100, 100, 100],
[200, 200, 200],
[0, 0, 0]]
)

et un autre tableau qui ressemble à ceci:

arr_b = np.array(
[[100, 100, 100],
[200, 200, 200]]
)

Je cherche pour une fonction que je peux appeler comme ceci: np.boolean_combine (arr_a, arr_b) , pour renvoyer un tableau qui remplacera les 1 dans arr_a par les valeurs de arr_b, pour un résultat final qui ressemble à ceci:

arr_a = np.array(
[[False, False, False],
[True, True, True],
[True, True, True],
[False, False, False]]
)

Existe-t-il une telle fonction?


2 commentaires

Les formes seront-elles toujours un match? Ainsi, arra_b.size sera-t-il toujours égal au nombre de True dans arr_a ?


Oui, les formes seront toujours une correspondance


3 Réponses :


2
votes

Vous pouvez créer un nouveau tableau du même dtype que arra_b , prendre une vue en tranches en utilisant arr_a et attribuer les valeurs de arra_b :

out = arr_a.astype(arra_b.dtype)
out[arr_a] = arra_b.ravel()

array([[  0,   0,   0],
       [100, 100, 100],
       [200, 200, 200],
       [  0,   0,   0]])


0 commentaires

1
votes

Si votre arr_a est composé de 1 et de 0:

import numpy as np 
arr_a = np.array(
[[0, 0, 0],
[1, 1, 1],
[1, 1, 1],
[0, 0, 0]])
arra_b = np.array(

[[100, 100, 100],

[200, 200, 200]])


arr_a[np.where(arr_a)]  = arra_b.reshape(arr_a[np.where(arr_a)].shape)

Cela fonctionne, en supposant que les formes correspondent


2 commentaires

Voici ce que cela a renvoyé: >>> arr_a = np.array ([[0, 0, 0], [1, 1, 1], [0, 0, 0]]) >>> arra_b = np.array ( [[100, 100, 100], [200, 200, 200]]) >>> arr_a [np.where (arr_a)] = arra_b.reshape (arr_a [np.where (arr_a)]. Shape) Traceback (plus dernier appel récent): Fichier "", ligne 1, dans ValueError: impossible de remodeler un tableau de taille 6 en forme (3,)


Je viens de l'exécuter à nouveau et cela fonctionne sans erreur. Vérifiez la modification de ma réponse pour voir si mes tableaux a et b sont égaux au vôtre



0
votes

Vous pouvez utiliser zip () . Supposons que arr_a et arr_b soient (évidemment, de votre problème) de la même dimension:

def boolean_combine(arr_a, arr_b) -> np.array:
  combined = []
  for row_a, row_b in zip(arr_a, arr_b):
    row_combined = []
    for a, b in zip(row_a, row_b):
      if a == 'True':
        row_combined.append(b)
      else:
        row_combined.append(a)
    combined.append(np.asarray(row_combined))
  return np.asarray(combined)

Ensuite, vous pouvez appeler cette fonction dans votre main en tapant simplement combine = boolean_combine (arr_a , arr_b)


0 commentaires