#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]