关于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的函数对应
其含义是:有两个向量
a
、b
,要实现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: