2016-10-20 5 views
2

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

У меня есть набор значений, которые указывают индексы в «глобальном» расчете, которые не следует настраивать.

Например, эти «фиксированные» индексы

1 2 6 

Если мой глобальный расчет десять элементов, я бы смог установить все «свободное» значение путем создания списка множества глобального индексов и вычитания фиксированных индексов.

free = list(set(range(len(global)) - set(fixed)) 
[0, 3, 4, 5, 7, 8, 9] 

в глобальном расчета, я смог бы настроить «свободные» элементы, как показано в следующем фрагменте кода

global = np.ones(10) 
global[free] = global[free] * 10 

, который должен производить:

global = [10, 1, 1, 10, 10, 10, 1, 10, 10, 10] 

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

local_map = [4, 2, 1, 8, 6] 
local_values = [40, 40, 40, 40, 40] 

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

Каким будет эквивалент глобального [бесплатного] на местном уровне? желаемый результат будет что-то вроде этого:

local_free = list(set(range(len(local)) - set(fixed)) 
local_values[local_free] *= 10 
OUTPUT: local_values = [400, 40, 40, 400, 40] 

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

ответ

0

Для таких операций сравнения, NumPy имеет такие инструменты, как np.setdiff1d и np.in1d и другие. Чтобы решить наш случай, этих двух было бы достаточно. Я бы предположил, что входы представляют собой массивы NumPy, так как тогда мы могли бы использовать векторизованные методы индексирования, поддерживаемые NumPy.

В первом случае мы имеем -

In [97]: fixed = np.array([1,2,6]) 
    ...: global_arr = np.array([10, 1, 1, 10, 10, 10, 1, 10, 10, 10]) 
    ...: 

Чтобы получить эквивалент list(set(range(len(global_arr)) - set(fixed)) в NumPy, мы могли бы использовать np.setdiff1d -

In [98]: np.setdiff1d(np.arange(len(global_arr)),fixed) 
Out[98]: array([0, 3, 4, 5, 7, 8, 9]) 

Далее, мы имеем -

In [99]: local_map = np.array([4, 2, 1, 8, 6]) 
    ...: local_values = np.array([42, 40, 48, 41, 43]) 
    ...: 

Мы пытались получить -

local_free = list(set(range(len(local)) - set(fixed)) 
local_values[local_free] *= 10 

Здесь мы можем использовать np.in1d, чтобы получить маску, чтобы быть эквивалентом local_free, которые могут быть использованы для индексации и назначения в local_values с boolean-indexing методом Numpy в -

In [100]: local_free = ~np.in1d(local_map,fixed) 
    ...: local_values[local_free] *= 10 
    ...: 

In [101]: local_values 
Out[101]: array([420, 40, 48, 410, 43]) 

 Смежные вопросы

  • Нет связанных вопросов^_^