Порядок будет отличаться от показанного вами, но значения будут такими же, как в следующем методе:
>>> 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]])