【问题标题】:How to get a cartesian-product of all pair from two vectors in numpy?如何从numpy中的两个向量中获得所有对的笛卡尔积?
【发布时间】:2019-11-21 16:08:26
【问题描述】:

这与this question 几乎相同,但在 numpy 中,以及针对某些维度的矩阵:

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

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] 对于某些 @987654334 @,其中来自AB 的元素为另一个中的每个其他元素选择一次。

一个更具体的例子:

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

然后

C = [
[elem1, elem4],[elem1, elem5],[elem1, elem6],
[elem2, elem4],[elem2, elem5],[elem2, elem6],
[elem3, elem4],[elem3, elem5],[elem3, elem6]
]

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

【问题讨论】:

  • 在此处查看解决方案:stackoverflow.com/questions/58971397/… 它可能对您有所帮助!
  • 您描述的是笛卡尔积,而不是叉积(可能是您自己没有找到解决方案的原因)。 This beautiful SO post 提供了一个带有 numpy-builtins 的解决方案以及作者所谓的“几乎规范的笛卡尔积”的丰富实现
  • 发布的解决方案对您有用吗?
  • @divakar 将在周日我回来工作时检查。别担心
  • @Gulzar 温馨提示 - 发布的解决方案对您有用吗?

标签: python numpy


【解决方案1】:

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

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。在第一种方法中,结果是沿第二个轴的 2 元素 ndarray - s[0],)+(2,)+s[1:]。因此,离开 A 和离开 B 的每个元素都沿该轴交错。这个堆叠操作有一个 NumPy 内置的 np.stack,这是第二种方法。因此,这两个是等价的,可以解决我们的问题。

还有一些验证:

问题要求 - a new matrix C, in which every element (C[i]) is a matrix of shape (2, 3, 4, 5)。因此,C 的形状将是 (n,2,3,4,5)。堆叠沿第二轴。此外,据我了解,问题是要求C[k][0] == A[k]k=0..nC[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

【讨论】:

  • 请解释一下为什么 1 线等于 5 线,它是如何提供所有对的?
  • @Gulzar 添加了 cmets。这能回答你的问题吗?
猜你喜欢
  • 2015-06-03
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2017-12-01
  • 2023-02-19
  • 2015-10-21
相关资源
最近更新 更多