NumPy: найти отсортированные индексы из маскированного двумерного массива выше и ниже порога - PullRequest
3 голосов
/ 23 августа 2011

У меня есть двумерный замаскированный массив значений, который мне нужно отсортировать по убыванию. Например:

import numpy as np

# Make a random masked array
>>> ar = np.ma.array(np.round(np.random.normal(50, 10, 20), 1),
                     mask=np.random.binomial(1, .2, 20)).reshape((4,5))
>>> print(ar)
[[-- 51.9 38.3 46.8 43.3]
 [52.3 65.0 51.2 46.5 --]
 [56.7 51.1 -- 38.6 33.5]
 [45.2 56.8 74.1 58.4 56.4]]

# Sort the array from lowest to highest, with a flattened index
>>> sorted_ind = ar.argsort(axis=None)
>>> print(sorted_ind)
[14  2 13  4 15  8  3 11  7  1  5 19 10 16 18  6 17  0 12  9]

Но с отсортированными индексами мне нужно разделить их на два простых подмножества: меньше или равно и больше или равно данного значения. Кроме того, мне не нужны маскированные значения, и они должны быть удалены. Например, с datum = 51.1, как мне отфильтровать sorted_ind до 10 индексов выше datum и 8 значений ниже? (Примечание: существует один общий индекс из-за логических критериев или равных . 3 маскированных значения можно удалить из анализа). Мне нужно сохранить сглаженную позицию индекса, так как позже я использую np.unravel_index(ind, ar.shape).

Ответы [ 2 ]

5 голосов
/ 23 августа 2011

для использования где:

import numpy as np
np.random.seed(0)
# Make a random masked array
ar = np.ma.array(np.round(np.random.normal(50, 10, 20), 1),
                     mask=np.random.binomial(1, .2, 20)).reshape((4,5))
# Sort the array from lowest to highest, with a flattened index
sorted_ind = ar.argsort(axis=None)

tmp = ar.flatten()[sorted_ind]
print sorted_ind[np.ma.where(tmp<=51.0)]
print sorted_ind[np.ma.where(tmp>=51.0)]

, но так как tmp отсортирован, вы можете использовать np.searchsorted ():

tmp = ar.flatten()[sorted_ind].compressed() # compressed() will delete all invalid data.
idx = np.searchsorted(tmp, 51.0)
print sorted_ind[:idx]
print sorted_ind[idx:len(tmp)]
3 голосов
/ 23 августа 2011

Подготовка:

>>> ar = np.ma.array(np.round(np.random.normal(50, 10, 20), 1),
                     mask=np.random.binomial(1, .2, 20)).reshape((4,5))
>>> print(ar)
[[59.9 51.3 -- 19.7 --]
 [59.1 57.2 48.6 49.8 46.3]
 [51.1 61.6 36.9 52.2 51.7]
 [37.9 -- -- 53.1 57.5]]
>>> sorted_ind = ar.argsort(axis=None)
>>> sorted_ind
array([ 3, 12, 15,  9,  7,  8, 10,  1, 14, 13, 18,  6, 19,  5,  0, 11,  4,
        2, 16, 17])

Тогда новый материал

>>> flat = ar.flatten()
>>> leq_ind = filter(lambda x: flat[x] <= 51.1, sorted_ind)
>>> leq_ind
[3, 12, 15, 9, 7, 8, 10]
>>> geq_ind = filter(lambda x: flat[x] >= 51.1, sorted_ind)
>>> geq_ind
[10, 1, 14, 13, 18, 6, 19, 5, 0, 11]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...