Numpy заменить значения в массиве, используя putmask и индексацию - PullRequest
2 голосов
/ 18 марта 2019

Я хотел бы заменить значения в NumpyArray, только в одном столбце, только на нескольких выбранных строках, используя маску. Я хочу использовать индексирование для изменяемого массива, а также используемую маску. Для этого я создаю массив nd.array, маску и массив желаемых замен. следующим образом:

import numpy as np

a = np.linspace(1,30,30)
a.shape(10,3)
mask = np.random.randint(2, size=8)
replacements = a[[2,4,5,6,7,8],0]*a[[2,4,5,6,7,8],1]

a
array([[ 1.,  2.,  3.],
   [ 4.,  5.,  6.],
   [ 7.,  8.,  9.],
   [10., 11., 12.],
   [13., 14., 15.],
   [16., 17., 18.],
   [19., 20., 21.],
   [22., 23., 24.],
   [25., 26., 27.],
   [28., 29., 30.]])

mask
array([0, 1, 0, 0, 1, 0, 1, 1])

replacements
array([ 56., 182., 272., 380., 506., 650.])

np.putmask(a[[2,4,5,6,7,8],2], mask[2::], replacements)

Мой ожидаемый результат будет выглядеть так:

a
array([[ 1.,  2.,  3.],
   [ 4.,  5.,  6.],
   [ 7.,  8.,  9.],
   [10., 11., 12.],
   [13., 14., 15.],
   [16., 17., 272.],
   [19., 20., 21.],
   [22., 23., 506.],
   [25., 26., 650.],
   [28., 29., 30.]])

Но вместо этого я получаю это:

a
array([[ 1.,  2.,  3.],
   [ 4.,  5.,  6.],
   [ 7.,  8.,  9.],
   [10., 11., 12.],
   [13., 14., 15.],
   [16., 17., 18.],
   [19., 20., 21.],
   [22., 23., 24.],
   [25., 26., 27.],
   [28., 29., 30.]])

У кого-нибудь может быть идея?

1 Ответ

1 голос
/ 18 марта 2019

Обратите внимание, что вы используете необычную индексацию, поэтому при использовании np.putmask вы изменяете copy, а не секционированное представление , и, таким образом, исходный массив остается неизменным.Вы можете проверить это, пытаясь индексировать с помощью нотации среза, например, np.putmask(a[2:8,2], mask[2::], replacements), которая будет в этом случае изменить значения в a.

Что вы можете сделать, это использовать np.where и переназначить значения соответствующим индексам в a:

a[[2,4,5,6,7,8],2] = np.where(mask[2::], replacements, a[[2,4,5,6,7,8],2])

Выход

array([[  1.,   2.,   3.],
       [  4.,   5.,   6.],
       [  7.,   8.,  56.],
       [ 10.,  11.,  12.],
       [ 13.,  14., 182.],
       [ 16.,  17., 272.],
       [ 19.,  20., 380.],
       [ 22.,  23., 506.],
       [ 25.,  26., 650.],
       [ 28.,  29.,  30.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...