Dans la réponse liée, How to set first N elements of array to zero?
la solution pour les tableaux est
y = numpy.array(x)
y[0:n] = 0
Dans d'autres mots si nous remplissons une tranche (gamme d'indices) avec le même nombre, nous pouvons spécifier un scalaire. Il peut s'agir d'un tableau de la même taille, par ex. np.ones(n)
. Mais ça ne doit pas être.
donc nous avons juste besoin d'itérer sur les lignes de a
(et des éléments de b
) et effectuer cette mission indexée
In [368]: a = np.ones((3,4))*np.nan
In [369]: for i in range(3):
...: a[i,:b[i]] = 1
...:
In [370]: a
Out[370]:
array([[ 1., 1., nan, nan],
[ 1., 1., 1., nan],
[ 1., nan, nan, nan]])
Il existe différentes façons de « remplissage » du tableau original avec nan
.np.full
fait un np.empty
suivi d'un copyto
. Une variante de l'itération de ligne est for i,n in enumerate(a):
.
Un autre bon moyen d'itération dans un sens coordonné est avec zip
.
In [371]: for i,x in zip(b,a):
...: x[:i] = 1
Ceci profite du fait que l'itération sur un tableau 2d itère sur ses lignes. Donc, x
est une vue 1d de a
et peut être modifié sur place.
Mais avec un peu de tricherie d'indexation, nous n'avons même pas à boucler.
In [373]: a = np.full((3,4),np.nan)
In [375]: mask = np.array(b)[:,None]>np.arange(4)
In [376]: mask
Out[376]:
array([[ True, True, False, False],
[ True, True, True, False],
[ True, False, False, False]], dtype=bool)
In [377]: a[mask] = 1
In [378]: a
Out[378]:
array([[ 1., 1., nan, nan],
[ 1., 1., 1., nan],
[ 1., nan, nan, nan]])
Ceci est un favori de l'une des meilleures affiches numpy
, @Divakar
.
Numpy: Fix array with rows of different lengths by filling the empty elements with zeros
Il peut être utilisé pour pad
une liste de listes. En parlant de rembourrage, itertools
a un outil pratique, zip_longest
(nom AP3)
In [380]: np.array(list(itertools.zip_longest(*[np.ones(x).tolist() for x in b],fillvalue=np.nan))).T
Out[380]:
array([[ 1., 1., nan],
[ 1., 1., 1.],
[ 1., nan, nan]])
Votre question aurait dû préciser ce qui était erroné; quels types d'erreurs que vous avez:
for i in w2:
a[0:b[i]] = [1] * b[i]
a[i:] = np.ones((b[i]))
w2
est indéterminée, mais est probablement range(3)
.
a[0:b[i]]
est erroné car il spécifie toutes les lignes, où que vous travaillez sur un seul à la fois. a[i:]
spécifie également une plage de lignes.
Lorsque vous postez un code comme celui-ci, vous devriez en dire plus que «ça ne marche pas». Ce qui était faux? Quel genre d'erreur? Un tweak mineur le fait fonctionner: 'pour i dans la gamme (3): a [i, 0: b [i]] = 1' Vous n'avez pas appliqué complètement la réponse liée. – hpaulj
@hpaulj Vous avez raison, je l'ai ajouté maintenant pour l'exhaustivité. Si j'utilise votre tweak une erreur provoquée par la dernière ligne apparaît '(ValueError: impossible de diffuser le tableau d'entrée de forme (2) en forme (3,4))'. Si je supprime cette ligne, tout va bien! –
@hpaulj mon mauvais, ça ne marche pas. L'ensemble du tableau est rempli de ceux. Cependant votre solution avec enumerate fonctionne parfaitement –