Как заменить 0 значений в массиве numpy на другие значения в зависимости от диапазона столбцов? - PullRequest
1 голос
/ 27 мая 2019

У меня есть набор данных в следующем формате:

[[ 226 600 3.33 915. 92.6 98.6 ] [ 217 700 3.34 640. 93.7 98.5 ] [ 213 900 3.35 662. 88.8 96. ] ... [ 108 600 2.31 291. 64. 70.4 ] [ 125 800 3.36 1094. 65.5 84.1 ] [ 109 400 2.44 941. 52.3 68.7 ]]

Каждый столбец - это отдельный критерий, который имеет свой собственный диапазон значений.Как я могу вменять значения, которые 0, в значения, которые больше нуля, в зависимости от диапазона столбцов?Другими словами, худшее минимальное значение, отличное от 0.

Я написал следующий код, но он может только изменить 0 на минимальное значение в столбце (что, конечно, 0) илиmax.max зависит от столбца.Спасибо за вашу помощь!

# Impute 0 values -- give them the worst value for that column

I, J = np.nonzero(scores == 0)
scores[I,J] = scores.min(axis=0)[J] # can only do min or max

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Я думаю, что numpy.ma.masked_equal - это то, что вам нужно.

рассмотрим массив:

a = np.array([4, 3, 8, 0, 5])
m = np.ma.masked_equal(a, 0) # mask = [0, 0, 0, 1, 0]

теперь вы можете вызывать m.min(), и это значение является вторым наименьшим значением в столбце.

m.min() # 3
1 голос
/ 27 мая 2019

Одним из способов будет использование masked array для нахождения минимального значения вдоль столбцов, маскирующих те, которые <=0. И замените 0s в массиве соответствующим минимумом, используя np.where:

min_gt0 = np.ma.array(r, mask=r<=0).min(0)
np.where(r == 0, min_gt0, r)

Вот пример:

r = np.random.randint(0,5,(5,5))

print(r)
array([[2, 1, 3, 0, 4],
       [0, 4, 4, 2, 2],
       [4, 0, 0, 0, 1],
       [1, 2, 2, 2, 2],
       [2, 0, 4, 4, 2]])

min_gt0 = np.ma.array(r, mask=r<=0).min(0)
np.where(r == 0, min_gt0, r)

array([[2, 1, 3, 2, 4],
       [1, 4, 4, 2, 2],
       [4, 1, 2, 2, 1],
       [1, 2, 2, 2, 2],
       [2, 1, 4, 4, 2]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...