【问题标题】:How to assign values of a 2d array to 3d array in NumPy如何在 NumPy 中将 2d 数组的值分配给 3d 数组
【发布时间】:2017-11-15 17:26:00
【问题描述】:

我目前正在处理一个名为X、大小为(100,5,1) 的3d 数组。我想将随机创建的名为s、维度为(5,1) 的二维数组分配给X。我的代码如下所示。

for i in range(100):
    s = np.random.uniform(-1, 2, 5) 
    for j in range(5):
        X[:,j,:] = s[j]

我有 100 个 (5,1) 数组,它们都是一样的。我可以看到为什么我有这个结果,但我找不到解决方案。

我需要在 X 中有 100 个唯一的 (5,1) 数组。

【问题讨论】:

  • 一次性创建所需大小的100 x 5 x 1 3D 矩阵不是更容易吗? s = np.random.uniform(low=-1, high=2, size=(100, 5, 1))... 特别是因为每个 5 x 1 向量都来自相同的概率分布。为什么要单独创建 100 个5 x 1 数组?
  • 不应该是X[i,j,:] = s[j]吗?
  • @Divakar 是的。是的,它应该。
  • 是的,我刚刚意识到这是不正确的。它应该是 X[i,j,:] = s[j]。非常感谢!

标签: python arrays numpy random


【解决方案1】:

您正在索引整个第一个维度,因此广播单个 5 x 1 数组。这就是您看到副本的原因,它只记住您在循环中创建的最后一个随机生成的5 x 1 数组,可以看到整个第一维。要解决此问题,只需将索引从 : 更改为 i

X[i,j,:] = s[j]

但是,这似乎是一种不好的代码气味。我建议通过将size 输入参数覆盖到numpy.random.uniform 中一次性分配您需要的确切大小。

s = np.random.uniform(low=-1, high=2, size=(100, 5, 1))

因此,不要循环,只使用上述语句一次。这是有道理的,因为您创建的每个 5 x 1 数组都是从相同的概率分布中采样的。从效率的角度来看,只分配一次所需的大小会更有意义。

【讨论】:

  • 实际上当我覆盖 s 的 size 参数时,我得到了广播错误。但它似乎只适用于 X[i,j,:] = s[j]
  • @kneazle 覆盖size 的目的是让您不需要循环。你只需要使用一个语句。因此,请将您的整个代码替换为 s = np.random.uniform(low=-1, high=2, size=(100, 5, 1))。在你的循环中使用这段代码显然会给你广播错误。
  • @kneazle 没问题!祝你好运!
猜你喜欢
  • 2013-08-28
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 2015-04-07
  • 2021-12-29
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多