例如我有
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]])
我想从“ a”中减去“ b”的每个元素,但不使用for循环。我使用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]])
答案 0 :(得分:2)
顺序将与您显示的顺序不同,但是使用以下方法,其值将相同:
>>> 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]])
那只是减法的问题。
[EDIT] ,由于您说需要保留订单,因此可以执行以下操作:
>>> 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]])