【问题标题】:How to assign a 1D numpy array to 2D numpy array?如何将 1D numpy 数组分配给 2D numpy 数组?
【发布时间】:2013-08-28 14:58:51
【问题描述】:

考虑以下简单示例:

X = numpy.zeros([10, 4])  # 2D array
x = numpy.arange(0,10)    # 1D array 

X[:,0] = x # WORKS

X[:,0:1] = x # returns ERROR: 
# ValueError: could not broadcast input array from shape (10) into shape (10,1)

X[:,0:1] = (x.reshape(-1, 1)) # WORKS

有人可以解释为什么 numpy 有形状为 (N,) 而不是 (N,1) 的向量吗? 将一维数组转换为二维数组的最佳方法是什么?

我为什么需要这个? 因为我有一个将结果x 插入到二维数组X 中的代码,并且x 的大小会不时变化,所以我有X[:, idx1:idx2] = x,如果x 也是二维的,但如果x 是一维则不行。

【问题讨论】:

    标签: python arrays numpy multidimensional-array


    【解决方案1】:

    您真的需要能够使用相同的功能同时处理 1D 和 2D 输入吗?如果您知道输入将是一维的,请使用

    X[:, i] = x
    

    如果您知道输入将是 2D,请使用

    X[:, start:end] = x
    

    如果您不知道输入尺寸,我建议您使用if 在一行或另一行之间切换,尽管可能有一些我不知道的索引技巧可以同时处理两者。

    您的 x 具有形状 (N,) 而不是形状 (N, 1)(或 (1, N)),因为 numpy 不仅仅是为矩阵数学构建的。 ndarrays 是 n 维的;它们支持任何非负维数(包括 0)的高效、一致的矢量化操作。虽然这有时可能会使矩阵运算不那么简洁(尤其是在 dot 用于矩阵乘法的情况下),但当您的数据自然是一维或 3-、4- 或 n- 时,它会生成更普遍适用的代码维度。

    【讨论】:

      【解决方案2】:

      我认为您的问题中已经包含了答案。 Numpy 允许数组具有任何维度(而 afaik Matlab 在可能的情况下更喜欢二维),因此您需要对此保持正确(并始终区分 (n,) 和 (n,1))。通过将一个数字作为索引之一(如第 3 行中的 0),您可以将维度减少一。通过将范围作为索引之一(如第 4 行中的 0:1),您不会降低维度。

      第 3 行对我来说非常有意义,我会以这种方式分配给二维数组。

      【讨论】:

        【解决方案3】:

        这里有两个技巧可以使代码更短。

        X = numpy.zeros([10, 4])  # 2D array
        x = numpy.arange(0,10)    # 1D array 
        X.T[:1, :] = x
        X[:, 2:3] = x[:, None]
        

        【讨论】:

        • 您能补充一些评论吗?我不清楚你是如何从原始代码到这里的,以及为什么这可以解决问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多