Python 如何从numpy中的两个向量得到所有对的笛卡尔积?

Python 如何从numpy中的两个向量得到所有对的笛卡尔积?,python,numpy,Python,Numpy,这几乎与相同,但在numpy中,对于某些维度上的矩阵: 我有两个长度为n的矩阵,A和B,例如 n = 1000 A = np.random.rand(n, 3, 4, 5) B = np.random.rand(n, 3, 4, 5) 我想要一个新的矩阵C,其中每个元素(C[I])都是一个形状矩阵(2,3,4,5):C[I][0]是a[k],而C[I][0]是B[k],对于一些k,其中,A和B中的元素对另一个元素中的其他元素选择一次 一个更具体的例子: A = [elem1, elem2, e

这几乎与相同,但在numpy中,对于某些维度上的矩阵:

我有两个长度为n的矩阵,
A
B
,例如

n = 1000
A = np.random.rand(n, 3, 4, 5)
B = np.random.rand(n, 3, 4, 5)
我想要一个新的矩阵
C
,其中每个元素(
C[I]
)都是一个形状矩阵
(2,3,4,5)
C[I][0]
a[k]
,而
C[I][0]
B[k]
,对于一些
k
,其中,
A
B
中的元素对另一个元素中的其他元素选择一次

一个更具体的例子:

A = [elem1, elem2, elem3]
B = [elem4, elem5, elem6]
然后


我知道我可以使用itertools来构建它,但我认为它已经存在,而且速度更快。

从更简单的理解角度来看,基于作业的方法是有意义的。因此-

dt = np.result_type(A.dtype,B.dtype)
s = A.shape
C = np.empty((s[0],)+(2,)+s[1:],dtype=dt)
C[:,0] = A
C[:,1] = B
这可以通过一个班轮的堆叠操作来简化-

C = np.stack((A,B),axis=1)
关于这两种方法如何解决它的一些解释:

一条直线基本上是在B之后叠加A。在第一种方法中,结果是沿第二个轴-s[0],)+(2,)+s[1:]的2元素Ndaray。因此,off A和off B的每个元素沿着该轴交错。此堆叠操作有一个NumPy内置的np.stack,这是第二种方法。因此,这两者是等价的,可以解决我们的问题

还有一些验证:

问题是问-
一个新的矩阵C,其中每个元素(C[i])都是形状为(2,3,4,5)的矩阵。因此,
C
的形状是
(n,2,3,4,5)
。堆叠沿第二个轴进行。此外,根据我的理解,这个问题是要求
C[k][0]
=
A[k]
用于
k=0..n
C[k][1]
=
B[k]
用于
k=0..n
。让我们证明这一点-

In [323]: n = 1000
     ...: A = np.random.rand(n, 3, 4, 5)
     ...: B = np.random.rand(n, 3, 4, 5)

In [324]: C = np.stack((A,B),axis=1)

In [325]: np.all([np.allclose(C[i][0],A[i]) for i in range(1000)])
Out[325]: True

In [326]: np.all([np.allclose(C[i][1],B[i]) for i in range(1000)])
Out[326]: True

检查这里的解决方案:它可能会帮助你!您所描述的是笛卡尔积,而不是叉积(可能是您自己没有找到解决方案的原因)。提供了一个numpy内置解决方案,以及作者所谓的“近乎规范的笛卡尔产品”的慷慨实现。发布的解决方案对你有用吗?@divakar将在周日我回来工作时检查。不worry@Gulzar温和提醒-发布的解决方案对你有用吗?请解释为什么一行线等同于五行线,以及它如何提供所有的对?@Gulzar补充道。这回答了你的问题吗?
In [323]: n = 1000
     ...: A = np.random.rand(n, 3, 4, 5)
     ...: B = np.random.rand(n, 3, 4, 5)

In [324]: C = np.stack((A,B),axis=1)

In [325]: np.all([np.allclose(C[i][0],A[i]) for i in range(1000)])
Out[325]: True

In [326]: np.all([np.allclose(C[i][1],B[i]) for i in range(1000)])
Out[326]: True