如何用numpy中的另一个ndarray的每个元素减去ndarray中的每个元素

时间:2018-08-24 19:55:50

标签: python-3.x numpy

例如我有

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

1 个答案:

答案 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]])

说明

代码要做的是创建ab的重复,因此对于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]])