【问题标题】:ValueError: could not broadcast input array from shape (100,2) into shape (101,2)ValueError:无法将输入数组从形状(100,2)广播到形状(101,2)
【发布时间】:2018-09-25 04:08:30
【问题描述】:

我正在尝试创建一个尺寸为 (101, 2, 1000) 的 3d 张量。我不得不将我找到的 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)

【问题讨论】:

    标签: python arrays loops sorting iterator


    【解决方案1】:

    问题似乎是尺寸不匹配。具体来说,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

    【讨论】:

    • 嘿维克多!你如何让样本变成 101,所以从迭代开始,从 0 开始直到满 100,而不仅仅是直到 99?
    • @MarvelousDamnit 我认为我们仍然不需要 + 1samples_increment,因为数组是从 0 开始的。循环的终止条件似乎是剩下的问题:将&lt;= 翻转为&lt; 似乎可以解决问题。 (因为end 将不再超出dx 的结尾,这导致它只获取100 个元素而不是101 个。)
    猜你喜欢
    • 2021-07-06
    • 2018-06-30
    • 2018-06-08
    • 2020-01-21
    • 2020-10-18
    • 2018-04-21
    • 2020-10-09
    • 2021-03-30
    • 2021-08-24
    相关资源
    最近更新 更多