np.subtract.outer()


关于np.subtract.outer()的使用,以下做简单介绍

import numpy as np

a = np.array([5,6,7])
b = np.array([9,12,10])

np.subtract.outer(b,a)
Out[11]: 
array([[4, 3, 2],
       [7, 6, 5],
       [5, 4, 3]])

上述代码或许之前没接触np.subtract.outer()的人会晕住,这是什么情况?似乎没有规律可言,其实是有的
请看,

9 - 5 = 4
9 - 6 = 3
9 - 7 = 2

12 - 5 = 7
12 - 6 = 6
12 - 7 = 5

10 - 5 = 5
10 - 6= 4
10 - 7= 3

你看懂了吗?
用代码来写就是:
其实,上面三行等价于:

b[:,None]-a
array([[4, 3, 2],
       [7, 6, 5],
       [5, 4, 3]])

关于b[:,None]-a

b[:,None]
Out[13]: 
array([[ 9],
       [12],
       [10]])

'''
利用numpy数组的广播特性实现
b[:,None]中的每个值减去a中的每个值
'''

也就是:

np.subtract.outer(b,a)是b[:,None]-a的函数对应
其含义是:

有两个向量ab,要实现a中的每个元素与b中的每个元素进行比较

learn from:在python中用两个向量构建一个比较矩阵


代码1:

A = np.array([3,2,1])
B = np.array([3,4,5])
#方法1
print(b[:,None]-a)

#方法2
print(np.subtract.outer(B,A))

[[0 1 2]
 [1 2 3]
 [2 3 4]]
 
*****************************************************
calculation idea:
    3  2  1
  -
3   0  1  2
4   1  2  3
5   2  3  4

代码2:

A = np.arange(3).reshape(3,1)
B = np.arange(3).reshape(1,3)

#方法1
print(A+B)

#方法2,使用迭代器
it = np.nditer([A,B,None])
for x,y,z in it: 
    z[...] = x + y 
print(it.operands[2])

[[0 1 2]
 [1 2 3]
 [2 3 4]]
 
 *****************************************************
calculation idea:
     0  1  2
   +
0    0  1  2   
1    1  2  3   
2    2  3  4   

关于代码1和代码2:

  • 代码1
    • B中的每个元素减去A中每个元素的值
  • 代码2
    • A中的每个元素的值加上B中每个元素的值

你可能感兴趣的:(#,模块和函数)