как вычесть каждый элемент в ndarray с каждым элементом каждого ndarray в numpy - PullRequest
0 голосов
/ 24 августа 2018

например, у меня есть,

a = np.array([[0.4 , 0.87, 0.24, 0.1 ],
              [0.6 , 0.93, 0.34, 0.98],
              [0.5 , 0.32, 0.09, 0.99],
              [0.4 , 0.11, 0.18, 0.65],
              [0.5 , 0.98, 0.47, 0.78]])

b = np.array([[0.6 , 0.93 ,0.34 ,0.98],
              [0.7 , 0.47 ,0.43, 0.76]])

Я хочу вычесть каждый элемент 'b' из 'a', но без использования цикла for.Я использовал для цикла, чтобы получить вывод, но у меня есть несколько строк и занимает больше времени. Есть ли способ сделать это эффективно с меньшим количеством времени в numpy?

Я ожидаю, что результат будет выглядеть так:

array([[ 0.2 ,  0.06,  0.1 ,  0.88],
       [ 0.  ,  0.  ,  0.  ,  0.  ],
       [ 0.1 ,  0.61,  0.25, -0.01],
       [ 0.2 ,  0.82,  0.16,  0.33],
       [ 0.1 , -0.05, -0.13,  0.2 ],
       [ 0.3 , -0.4 ,  0.19,  0.66],
       [ 0.1 , -0.46,  0.09, -0.22],
       [ 0.2 ,  0.15,  0.34, -0.23],
       [ 0.3 ,  0.36,  0.25,  0.11],
       [ 0.2 , -0.51, -0.04, -0.02]])

1 Ответ

0 голосов
/ 24 августа 2018

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

>>> np.tile(b, (len(a),1)) - np.tile(a,(len(b),1))

array([[ 0.2 ,  0.06,  0.1 ,  0.88],
       [ 0.1 , -0.46,  0.09, -0.22],
       [ 0.1 ,  0.61,  0.25, -0.01],
       [ 0.3 ,  0.36,  0.25,  0.11],
       [ 0.1 , -0.05, -0.13,  0.2 ],
       [ 0.3 , -0.4 ,  0.19,  0.66],
       [ 0.  ,  0.  ,  0.  ,  0.  ],
       [ 0.2 ,  0.15,  0.34, -0.23],
       [ 0.2 ,  0.82,  0.16,  0.33],
       [ 0.2 , -0.51, -0.04, -0.02]])

Объяснение

Что делает код, так это создает повторы a и b, так что для каждой строки a у вас есть каждая строка b

>>> np.tile(b, (len(a),1))
array([[0.6 , 0.93, 0.34, 0.98],
       [0.7 , 0.47, 0.43, 0.76],
       [0.6 , 0.93, 0.34, 0.98],
       [0.7 , 0.47, 0.43, 0.76],
       [0.6 , 0.93, 0.34, 0.98],
       [0.7 , 0.47, 0.43, 0.76],
       [0.6 , 0.93, 0.34, 0.98],
       [0.7 , 0.47, 0.43, 0.76],
       [0.6 , 0.93, 0.34, 0.98],
       [0.7 , 0.47, 0.43, 0.76]])

>>> np.tile(a, (len(b),1))
array([[0.4 , 0.87, 0.24, 0.1 ],
       [0.6 , 0.93, 0.34, 0.98],
       [0.5 , 0.32, 0.09, 0.99],
       [0.4 , 0.11, 0.18, 0.65],
       [0.5 , 0.98, 0.47, 0.78],
       [0.4 , 0.87, 0.24, 0.1 ],
       [0.6 , 0.93, 0.34, 0.98],
       [0.5 , 0.32, 0.09, 0.99],
       [0.4 , 0.11, 0.18, 0.65],
       [0.5 , 0.98, 0.47, 0.78]])

Тогда это просто вопрос вычитания.

[РЕДАКТИРОВАТЬ] , так как вы говорите, что ваш заказ должен быть сохранен, вы можете сделать:

>>> np.repeat(b, len(a),axis=0) - np.tile(a,(len(b),1))
array([[ 0.2 ,  0.06,  0.1 ,  0.88],
       [ 0.  ,  0.  ,  0.  ,  0.  ],
       [ 0.1 ,  0.61,  0.25, -0.01],
       [ 0.2 ,  0.82,  0.16,  0.33],
       [ 0.1 , -0.05, -0.13,  0.2 ],
       [ 0.3 , -0.4 ,  0.19,  0.66],
       [ 0.1 , -0.46,  0.09, -0.22],
       [ 0.2 ,  0.15,  0.34, -0.23],
       [ 0.3 ,  0.36,  0.25,  0.11],
       [ 0.2 , -0.51, -0.04, -0.02]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...