【问题标题】:Creating a numpy matrix of tuples from 4 one-dimensional arrays从 4 个一维数组创建一个 numpy 元组矩阵
【发布时间】:2021-01-09 16:03:43
【问题描述】:

假设我有四个一维 numpy 数组 A、B、C、D,我想创建一个矩阵 M,使得矩阵的每个条目 M[i,j,k,l] 都是元组(a , b, c, d)

其中 a = A[i]、b = B[j]、c = C[k] 和 d = D[d]。

如何在没有循环的情况下高效地构建它?

【问题讨论】:

  • 为什么是元组?这不会是一个有效的数组。
  • 我想做矢量化;但是每个条目都是根据条目的索引来决定的——不确定如何做到这一点,因此正在考虑将其用作中间步骤

标签: python-3.x numpy numpy-ndarray


【解决方案1】:

您可以创建一个具有正确形状的空数组M(注意最后一维中的 4 - 那是您的元组),然后使用广播在 M 中分配整个行/列。

M = np.empty((
    len(a), len(b), len(c), len(d), 4
))

M[..., 0] = a[:, None, None, None]
M[..., 1] = b[None, :, None, None]
M[..., 2] = c[None, None, :, None]
M[..., 3] = d[None, None, None, :]

【讨论】:

  • 哦,只是一个额外的后续问题:如果我要在这个 5D 矩阵上应用 np.vectorize 并使用一些函数,这将作为每个条目的输入——是否可以排除第五维这样传递给vectorize的函数就可以取而代之的是4元素元组吗?
  • np.vectorize 一直迭代到标量元素级别。它有一个signature 参数,可能可以做你想做的事,但速度更慢。
  • np.vectorize 为您进行广播。如果您的函数是fn(a,b,c,d),则矢量化版本可以采用ffn(a[:,None,None,None], b[....] etc)(与上述相同的扩展数组)。但请记住,np.vectorize 不是速度工具;只是为了方便。
  • 啊,我明白了——还有其他选择吗?我试过np.apply_along_axis,也很慢。
  • apply_along_axis 也是一个迭代函数 - 迭代除最后一个之外的所有维度。如果您的函数仅适用于一维数组,则必须为较大的一维数组中的每个一维数组调用一次(加上一个试验调用以确定输出类型/形状)。它调用该函数 1000 次很慢,而不是迭代机制本身。
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 2018-06-29
  • 2019-06-09
  • 1970-01-01
  • 2016-09-22
  • 2010-10-08
相关资源
最近更新 更多