【问题标题】:Combine 2 ndarrays into one whose first components are the two initial ndarrays将 2 个 ndarray 组合成一个,其第一个组件是两个初始 ndarray
【发布时间】:2021-06-01 02:34:14
【问题描述】:

我有两个ndarrays,A 和 B。我想创建一个ndarray,C,这样C[0]=AC[1]=B

换个说法,如果A.shapeB.shape都给(a, b),我想创建一个ndarray,C,其形状为(2, a, b)

有没有办法构造它?对于形状为(a, b) 的N ndarrays,是否有一种有效的方法可以使最终的ndarray 的形状为(N, a, b)

【问题讨论】:

  • 只要np.array([a1, a2, a3, ...])。获得要加入的阵列列表后,即可轻松使用np.arraynp.stack

标签: python numpy numpy-ndarray


【解决方案1】:

您可以使用numpy.stack

a = np.ones((3, 4))
b = np.zeros((3, 4))
c = np.stack((a, b), axis=0)
c.shape  # (2, 3, 4)

数组c有以下数据:

array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]]])

【讨论】:

  • 在尝试后,我发现为 N ndarrays 执行此操作的一种方法是使用 np.stack((a_1, .., a_N), axis=0)。但是有没有比这行代码写所有数组更高效的方法呢?
  • 以什么方式更高效?您可以将所有数组放在一个列表中,然后将该列表传递给np.stack。这有帮助吗? arrays = [a_1, ..., a_N]; np.stack(arrays)
  • 我的每个 ndarrays 的名称都是 a_i 的形式,我的代码需要可推广到任意总数的此类数组(取决于将提供给程序的数据),所以我试图找到一种不涉及我回到代码并明确编写的方法,比如np.stack((a_1, a_2, a_3, a_4), axis=0),如果我总共有 4 个 ndarray。
  • 您必须使用这些细节更新您的问题,或者作为新问题提出。我建议将数组放在列表中怎么样?列表中可以有 N 个数组,列表中的位置将替换 a_i 变量名。
  • 是的,这就是我正在尝试的。我想我必须找到一种方法来创建一个循环,其每次迭代都会将 ndarray a_i 添加到列表中。谢谢!
【解决方案2】:

要实现您想要的,而不必指定axis,您可以使用dstack,它按顺序深度堆叠数组:

a = np.array([[1, 2], [3, 4]])
b = np.asarray([[5, 6], [7, 8]])

np.dstack((a, b))

array([[[1, 5],
        [2, 6]],

       [[3, 7],
        [4, 8]]])

【讨论】:

  • 输出的形状为(a, b, N),但OP需要(N, a, b)
猜你喜欢
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2021-10-15
  • 2017-05-07
  • 1970-01-01
  • 2018-02-20
  • 2021-08-19
相关资源
最近更新 更多