Замена значений столбцов в массиве с использованием маски масок и сохранения порядка - PullRequest
2 голосов
/ 26 мая 2011

У меня есть массив массивов с плавающей точкой, и я хочу пересчитать новые значения, используя формулу, которая зависит от того, какой столбец пересчитывается.

Сначала я попытался перебрать столбцы, замаскировав массив, за исключением столбца, который необходимо пересчитать, и заменив значения новыми значениями на numpy.putmask, но это не сохраняет порядок, так как он пытаетсяпоместить значение в каждом элементе и, в случае неудачи, пытается выполнить следующее вычисленное значение для следующего элемента, например:

>>> import numpy as np

>>> x = [[  1.,   2.],
        [  3.,   4.],
        [  5.,   6.],
        [  7.,   8.],
        [  9.,  10.]]
>>> mask = [[ True, False],
           [ True, False],
           [ True, False],
           [ True, False],
           [ True, False]]
>>> y = [ 21.,  22.,  23.,  24.,  25.]
>>> np.putmask(x,mask,y)
>>> print x
[[ 21.   2.]
[ 23.   4.]
[ 25.   6.]
[ 22.   8.]
[ 24.  10.]]

Мне нужно решение, которое будет повторяться с тем же значением, пока не найдет значение True, такой, что х будет выглядеть так:

[[ 21.   2.]
[ 22.   4.]
[ 23.   6.]
[ 24.   8.]
[ 25.  10.]]

Любые решения или другие методы приветствуются.Спасибо.

1 Ответ

1 голос
/ 26 мая 2011

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.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...