【问题标题】:Numpy: Shape mismatch error when putting 3d matrix into 4d matrix using boolean array indexing- pythonNumpy:使用布尔数组索引将 3d 矩阵放入 4d 矩阵时出现形状不匹配错误-python
【发布时间】:2020-04-20 19:37:55
【问题描述】:

我的代码有错误,我使用最简单的示例重新创建了它:

import numpy as np

zeros_4d = np.zeros((5,10,15,1))
zeros_3d = np.zeros((10,15,1))
ones_3d = zeros_3d + 1

bool_array = np.arange(0,15,1)>8

zeros_3d[:,9:,:] = ones_3d[:,9:,:] # This works fine
zeros_3d[:,bool_array,:] = ones_3d[:,bool_array,:] # This works fine

zeros_4d[0,:,9:,:] = ones_3d[:,9:,:] # This works fine

for i in np.arange(0,5,1):
    zeros_4d[0,i,bool_array,:] =  ones_3d[i,bool_array,:] # This works fine and does what I want

zeros_4d[0,:,bool_array,:] = ones_3d[:,bool_array,:] # This does not work

我收到此错误消息:'ValueError: shape mismatch: value array of shape (10,6,2) could not be broadcast to indexing result of shape (6,10,2)'

我不明白为什么会发生这种情况,有什么办法可以解决这个问题,或者正在循环最好的方法来解决这个问题。

【问题讨论】:

  • 你想达到什么目的?
  • 我想,3d 数组在我的真实代码中更小。例如,4d 数组的形状为 (5,10,15,2),3d 数组的形状为 (10,5,2),我想使用布尔索引将 3d 数组输入到 4d 数组中.我想在不使用循环的情况下执行此操作,因为我认为如果我正确执行它应该是可能的。
  • zeros_4d[0,:,bool_array,:] 索引是基本和高级的混合,中间有一个切片。这是一个特殊的记录案例,docs.scipy.org/doc/numpy/reference/…。所有切片维度都被推到最后,在布尔索引之后。
  • 谢谢你,@hpauji,我会花很长时间才能弄清楚这一点。第一次在这里发帖,但您的评论似乎足以回答。

标签: python numpy variable-assignment matrix-indexing


【解决方案1】:

zeros_4d[0,:,bool_array,:] 索引是基本和高级的混合,中间有一个切片。这是一个特殊的记录案例,docs.scipy.org/doc/numpy/reference/…。所有切片维度都被推到最后,在布尔索引之后。

所以你的 4d 形状和混合索引:

In [213]: arr = np.ones((5,10,15,2),int)                                                               
In [214]: arr[0,:, [1,2,3],:].shape                                                                    
Out[214]: (3, 10, 2)

我们可以通过首先选择前导维度来解决这个问题:

In [216]: arr[0][:, [1,2,3],:].shape                                                                   
Out[216]: (10, 3, 2)

In [217]: arr[0][:, [1,2,3],:] = 2                                                                     
In [218]: arr                                                                                          
Out[218]: 
array([[[[1, 1],
         [2, 2],
         [2, 2],
         ...,
         [1, 1],
         [1, 1],
         [1, 1]],
        ...

如果第一个索引生成副本而不是视图,则在分配期间拆分索引可能会出现问题。但是这里arr[0]是一个视图,所以没关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多