Как разбить массив по уникальным ключам? - PullRequest
1 голос
/ 09 апреля 2019

Я нахожу самое низкое значение в массиве "value", используя функцию min.Самому низкому значению присваивается 1, а все остальное - 0. У меня есть несколько переменных описательного столбца: наркотик, размер, сила, форма, время.Я хочу найти минимальное значение каждого уникального ключа, а не самое низкое значение во всем «значении» массива.

Я попытался запустить циклы для каждой переменной столбца.

def min_mask(arr):
    m = np.min(arr)
    return np.vectorize(lambda x: x == m)(arr).astype(int)

if __name__ == '__main__':
    my_arr = np.array(meltDF["value"])
    print(min_mask(my_arr))

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Вы можете сравнить элементы с их минимальными значениями по столбцам, а затем регистрировать с uint8, чтобы сэкономить немного места:

>>> import numpy as np                                                                                                                                                                                                                                     
>>> np.random.seed(444)                                                                                                                                                                                                                                 
>>> arr = np.random.rand(10, 4)                                                                                                                                                                                                                         
>>> (arr == arr.min(axis=0)).astype(np.uint8)                                                                                                                                                                                                           
array([[0, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 1],
       [0, 1, 0, 0],
       [0, 0, 1, 0]], dtype=uint8)

Из-за трансляции NumPy сравнениеarr == arr.min(axis=0) даст результат, который имеет ту же форму, что и arr, даже если arr.min(axis=0) будет иметь форму (4,).

Обратите внимание, что если столбцы имеют повторяющиеся минимумы, это может привести к созданию более одного "1 "в одном столбце.

0 голосов
/ 09 апреля 2019

Здесь есть много вариантов, например:

1) Предварительно инициализируйте маску и используйте argmin, чтобы заполнить соответствующие места:

arr = np.random.rand(10, 4)
indices = np.argmin(arr, axis=0)
mask = np.zeros_like(arr, dtype=np.int)
mask[indices, range(len(indices))] = 1

2) Использование apply_along_axis вероятно, вы предпочитаете стиль:

def is_minimum(v):
    return v == np.min(v)

mask = np.apply_along_axis(is_minimum, axis=0, arr=arr).astype(np.int)

В этих решениях предполагается, что каждый столбец соответствует уникальному ключу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...