putmask(x,mask,y)
устанавливает x.flat[n] = y[n]
для каждого n
, где mask.flat[n]
- Истина.
In [17]: list(x.flat)
Out[17]: [21.0, 2.0, 22.0, 4.0, 23.0, 6.0, 24.0, 8.0, 25.0, 10.0]
In [18]: list(mask.flat)
Out[18]: [True, False, True, False, True, False, True, False, True, False]
Поскольку mask.flat
чередуется между True
и False
, в конечном итоге вы устанавливаете каждое другое значение в x.flat
с каждым другим значением в y
.
Поскольку y
отличается от размера x
, значения в y
повторяются. Это то, что приводит к (нежелательным) переменным значениям, которые вы видите в x
после вызова
putmask(x,mask,y)
.
Если вместо этого вы хотите присвоить новые значения x
, где mask
равно True,
тогда все, что вам нужно, это присвоение с индексом numpy :
x[mask]=y
Например,
import numpy as np
x = np.array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.],
[ 9., 10.]])
mask = np.array([[ True, False],
[ True, False],
[ True, False],
[ True, False],
[ True, False]])
y = np.array([ 21., 22., 23., 24., 25.])
x[mask]=y
print(x)
# [[ 21. 2.]
# [ 22. 4.]
# [ 23. 6.]
# [ 24. 8.]
# [ 25. 10.]]