Numpy 添加向量的所有组合
Numpy Add All Combinations of Vectors
将两个向量数组的所有组合相加在数值上最有效的方法是什么?例如我想要的是以下内容:
a = np.array([[1,2,3], [4,5,6]])
b = np.array([[7,8,9], [10,11,12]])
[ai + bj for ai in a for bj in b]
给予
[array([ 8, 10, 12]),
array([11, 13, 15]),
array([11, 13, 15]),
array([14, 16, 18])]
它是一个带有向量而不是主要数据类型的网格。
我已经尝试了一些显式构建 meshgrid 结果,这比列表理解更快:
a_tile = np.tile(a, (2, 1))
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
b_repeat = np.repeat(b, 2, axis=0)
array([[ 7, 8, 9],
[ 7, 8, 9],
[10, 11, 12],
[10, 11, 12]])
a_tile + b_repeat
array([[ 8, 10, 12],
[11, 13, 15],
[11, 13, 15],
[14, 16, 18]])
这是最有效的吗?我一直在寻找一种广播数组的方法,这样就不会显式构建网格。
你可以使用numpy.broadcast_to广播数组
N = 2 #number of repeats
your_req_array = np.broadcast_to(b.T, (N,b.shape[1], b.shape[0])).transpose(2,0,1).reshape(-1,b.shape[1]) + np.broadcast_to(a, (N,a.shape[0], a.shape[1])).reshape(-1,b.shape[1])
您可以尝试以下方法:
import numpy as np
a = np.array([[1,2,3], [4,5,6]])
b = np.array([[7,8,9], [10,11,12]])
(a[..., None] + b.T).transpose(0, 2, 1).reshape(-1, 3)
它给出:
array([[ 8, 10, 12],
[11, 13, 15],
[11, 13, 15],
[14, 16, 18]])
将两个向量数组的所有组合相加在数值上最有效的方法是什么?例如我想要的是以下内容:
a = np.array([[1,2,3], [4,5,6]])
b = np.array([[7,8,9], [10,11,12]])
[ai + bj for ai in a for bj in b]
给予
[array([ 8, 10, 12]),
array([11, 13, 15]),
array([11, 13, 15]),
array([14, 16, 18])]
它是一个带有向量而不是主要数据类型的网格。
我已经尝试了一些显式构建 meshgrid 结果,这比列表理解更快:
a_tile = np.tile(a, (2, 1))
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
b_repeat = np.repeat(b, 2, axis=0)
array([[ 7, 8, 9],
[ 7, 8, 9],
[10, 11, 12],
[10, 11, 12]])
a_tile + b_repeat
array([[ 8, 10, 12],
[11, 13, 15],
[11, 13, 15],
[14, 16, 18]])
这是最有效的吗?我一直在寻找一种广播数组的方法,这样就不会显式构建网格。
你可以使用numpy.broadcast_to广播数组
N = 2 #number of repeats
your_req_array = np.broadcast_to(b.T, (N,b.shape[1], b.shape[0])).transpose(2,0,1).reshape(-1,b.shape[1]) + np.broadcast_to(a, (N,a.shape[0], a.shape[1])).reshape(-1,b.shape[1])
您可以尝试以下方法:
import numpy as np
a = np.array([[1,2,3], [4,5,6]])
b = np.array([[7,8,9], [10,11,12]])
(a[..., None] + b.T).transpose(0, 2, 1).reshape(-1, 3)
它给出:
array([[ 8, 10, 12],
[11, 13, 15],
[11, 13, 15],
[14, 16, 18]])