Разрезание массива словарей по ключу - PullRequest
0 голосов
/ 03 декабря 2018

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

Я обнаружилчто довольно просто получить подмножество строк из моего набора данных, используя:

dataset[dataset[:, 0] == 1]

, и это возвращает пустой массив всех строк, где метка равна 1. Что я хочу сделать, это что-то вродеthis (этот пример не работает):

dataset[2 in dataset[:, 1]]

, где он возвращает пустой массив всех строк, имеющих 2 в качестве ключа в словаре.Еще более полезным был бы способ фильтрации пары ключ-значение (этот текущий набор - все двоичные функции, но у меня есть другие проекты, которые имеют несколько возможностей).

Я использую Python 3.6.Заранее спасибо за вашу помощь!

Вот пример данных, которые я пытаюсь проанализировать:

[1 {10: 1, 12: 1, 15: 1, 18: 1, 31: 1, 36: 1, 48: 1, 59: 1, 70: 1, 79: 1, 90: 1, 100: 1, 125: 1, 140: 1, 163: 1, 185: 1, 200: 1}]
[1 {9: 1, 11: 1, 14: 1, 18: 1, 29: 1, 36: 1, 48: 1, 59: 1, 68: 1, 79: 1, 89: 1, 103: 1, 120: 1, 143: 1, 160: 1, 180: 1, 200: 1}]
[-1 {10: 1, 11: 1, 14: 1, 18: 1, 29: 1, 35: 1, 46: 1, 57: 1, 68: 1, 79: 1, 90: 1, 104: 1, 124: 1, 143: 1, 163: 1, 183: 1, 203: 1}]
[1 {9: 1, 11: 1, 14: 1, 18: 1, 30: 1, 35: 1, 46: 1, 57: 1, 68: 1, 79: 1, 90: 1, 103: 1, 123: 1, 143: 1, 163: 1, 183: 1, 204: 1}]
[-1 {10: 1, 12: 1, 14: 1, 18: 1, 33: 1, 36: 1, 45: 1, 56: 1, 67: 1, 78: 1, 89: 1, 100: 1, 120: 1, 140: 1, 160: 1, 193: 1, 203: 1}]

Первое предложение сработало отлично, но потом я понял, что я также вырезаюстроки, которые не имеют функции, но кроме супер медленной функции, которая получает индексы добавленных строк, а затем добавляет другие в другой набор, я не могу заставить его работать.Когда я пытаюсь что-то вроде:

helper2 = np.vectorize(not dict.__contains__)

, он говорит, что «объект bool не может быть вызван».

1 Ответ

0 голосов
/ 03 декабря 2018

Это не поможет с производительностью, но вы можете использовать np.vecorize на dict.__contains__ для имитации индексирования numpy.

import numpy as np

xs = np.array([[1, {1: 1}], [2, {2: 2}]])

helper = np.vectorize(dict.__contains__)

res = xs[helper(xs[:,1], 1)]
# array([[1, {1: 1}]], dtype=object)

Здесь helper является функцией двух аргументов.Первый аргумент - np.ndarray из dict с или dict.Второй аргумент - это np.ndarray ключей, которые вы хотите проверить, или один ключ.

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