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?
3 Réponses :
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]])
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
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 "
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
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)
Les formes seront-elles toujours un match? Ainsi,
arra_b.sizesera-t-il toujours égal au nombre deTruedansarr_a?Oui, les formes seront toujours une correspondance