фильтровать массив Numpy в отдельные массивы в зависимости от значения для построения контура - PullRequest
0 голосов
/ 02 октября 2018

У меня есть данные, которые я пытаюсь преобразовать в данные контурного графика.Я понимаю, что это можно сделать с помощью matplotlib, но я пытаюсь сделать это просто с помощью numpy, если это возможно.

Итак, скажем, у меня есть массив чисел 1-10, и я хочу разделить массив в соответствии сконтурить "уровни".Я хочу превратить входной массив в массив логических массивов, каждый из которых имеет размер ввода, с 1 / True для любой точки данных на этом уровне контура и 0 / False везде.

Например, предположим, что входные данные:

[1.2,2.3,3.4,2.5]

И уровни [1,2,3,4],

, тогда возвращаемое значение должно быть:

[[1,0,0,0],[0,1,0,1],[0,0,1,0]]

Итак, вот начало примера, который я набрал: import numpy as np

a = np.random.rand(3,3)*10
print(a)
b = np.zeros(54).reshape((6,3,3))

levs = np.arange(6)

#This is as far as I've gotten:
bins = np.digitize(a, levs)
print(bins)

Я могу использовать np.digitize, чтобы выяснить, какому уровню должно принадлежать каждое значение в a, но это далекокак я получаю.Я довольно новичок в numpy, и это действительно заставляет меня чесать голову.Любая помощь будет принята с благодарностью, спасибо.

1 Ответ

0 голосов
/ 02 октября 2018

Мы могли бы собрать индексы с выхода np.digitize, который представлял бы индексы по первым n-1 осям, где n - нет.из димс на выходе, которые будут установлены на выходе как True значения.Таким образом, мы могли бы использовать индексирование после настройки выходного массива, или мы могли бы использовать сравнение внешнего диапазона, чтобы достичь того же при плече broadcasting.

Следовательно, с broadcasting, который охватывает общие n-dim массивы-

idx = np.digitize(a, levs)-1
out = idx==(np.arange(idx.max()+1)).reshape([-1,]+[1]*idx.ndim)

С indexing-based одним повторным использованием idx из предыдущего метода это будет -

# https://stackoverflow.com/a/46103129/ @Divakar
def all_idx(idx, axis):
    grid = np.ogrid[tuple(map(slice, idx.shape))]
    grid.insert(axis, idx)
    return tuple(grid)

out = np.zeros((idx.max()+1,) + idx.shape,dtype=int) #dtype=bool for bool array
out[all_idx(idx,axis=0)] = 1

Пробный прогон -

In [77]: a = np.array([1.2,2.3,3.4,2.5])

In [78]: levs = np.array([1,2,3,4])

In [79]: idx = np.digitize(a, levs)-1
    ...: out = idx==(np.arange(idx.max()+1)).reshape([-1,]+[1]*idx.ndim)

In [80]: out.astype(int)
Out[80]: 
array([[1, 0, 0, 0],
       [0, 1, 0, 1],
       [0, 0, 1, 0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...