Использование numpy для проверки одного массива и быстрого создания другого

#python #numpy

Вопрос:

У меня есть простой вектор , который может содержать только 1, -1 или 0. Он представляет направление частицы. Например array([1, 0]) , или array([-1, 1]) я хочу добавить диагональ к компоненту, если ее нет.

введите описание изображения здесь моя текущая функция заключается в:

 def addcomp1(vec: array):  arr = np.empty(2, dtype=int)  for i, el in enumerate((i if i else  1 for i in vec)):  arr[i] = el  return arr  

Это делает любой прямой вектор, идущий на север, направленным на Северо-Запад. Или все, что идет на Запад, идите на северо-запад. Я думаю, что смогу сделать эту функцию быстрее. Мои намеки. Я использую всего 4 входа и 3 выхода. Я использую только 1,- 1 и 0. Я бы lru_cache функцию, но np.массивы не хэшируются. Есть какие-нибудь идеи? Просто используйте словарь, который соединяет (1, 0) в (1, 1)? Мне пришлось бы сделать их хэшируемыми…

Комментарии:

1. То есть, по сути, вы добавляете 1 к каждому нулю?

2. ДА. Возвращаемые векторы являются [1, 1] , [1, -1], [-1, 1]

3. Для чего-то такого маленького список python может быть быстрее.

Ответ №1:

Если я правильно понял, используйте:

 import numpy as np   def addcomp1(vec: np.array):  return np.where(vec == 0, 1, vec)   print(addcomp1(np.array([1, 1]))) print(addcomp1(np.array([0, 1]))) print(addcomp1(np.array([-1, 0])))  

Выход

 [1 1] [1 1] [-1 1]  

Ответ №2:

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

 arr = [(lambda x: 1 if not x else x)(s) for s in vec]