代码之家  ›  专栏  ›  技术社区  ›  Marvelous Damnit

ValueError:无法将输入数组从形状(100,2)广播到形状(101,2)

  •  0
  • Marvelous Damnit  · 技术社区  · 8 年前

    我正在尝试创建一个维度为(101,2,1000)的三维张量。我不得不将我找到的R代码翻译成python,但有一个问题,R开始在1处迭代,python开始在0处迭代。

    下面有没有办法解决这个问题?

    提前感谢!

    df1 = pd.DataFrame(np.random.rand(1000, 2), columns=['Col1', 'Col2'])
    a = np.array(df1)
    a_stdnorm = stats.norm.ppf(a)
    n_rows = a.shape[0]
    n_cols = a.shape[1]
    samples = 100
    if samples % 2 == 0:
        samples = samples + 1 # force an odd number
    samples_increment = samples - 1 # to cater for 1 based indices
    tensor = np.zeros((samples, n_cols, n_rows))
        sum_col = a[:,0] + a[:,1]
        sort = np.argsort(sum_col)
        block_half = samples // 2
        start = 0
        end = start + samples_increment
        for n in range(n_rows):
            if (n + 1) - block_half > 0 and n + block_half <= n_rows:
                start = n - block_half
                end = start + samples_increment
            dx = sort[start:end]
            data = a_stdnorm[dx,:]
            tensor[:,:,sort[n]] = data
    
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-50-1b371b208d20> in <module>()
         22     dx = sort[start:end]
         23     all_data = a_stdnorm[dx,:]
    ---> 24     tensor[:,:,sort[n]] = all_data
    
    ValueError: could not broadcast input array from shape (100,2) into shape (101,2)
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   user9645477 user9645477    8 年前

    问题似乎是大小不匹配。明确地 tensor 具有大小的切片 (101,2) 虽然 data 最终有了尺寸 (100,2)

    删除这些行:

    if samples % 2 == 0:
        samples = samples + 1 # force an odd number
    

    只是让这条线什么都不做:

    samples_increment = samples # to cater for 1 based indices (change #1)
    

    我们在哪里 不要 采取任何措施使样本数变为奇数似乎都能奏效。


    如果确实需要将样本数设为奇数,则首先需要更改此行,以不再执行任何操作:

    samples_increment = samples # to cater for 1 based indices
    

    然后您会发现,在最后一次迭代中,循环将失败。这是因为我们在计算时四舍五入 block_half 因为例子太多了。因此,您必须进行一些按摩才能更新 end 适合这种情况。