簡體   English   中英

Numpy:使用 boolean 數組索引將 3d 矩陣放入 4d 矩陣時出現形狀不匹配錯誤 - Z23EEEB4347BDD26BDDFC6B7EE

[英]Numpy: Shape mismatch error when putting 3d matrix into 4d matrix using boolean array indexing- python

我的代碼中有錯誤,我使用最簡單的示例重新創建了它:

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:形狀不匹配:形狀(10,6,2)的值數組無法廣播到形狀(6,10,2)的索引結果'

我不明白為什么會發生這種情況,我能做些什么來解決這個問題,或者正在循環最好的方法來解決這個問題。

zeros_4d[0,:,bool_array,:]索引是基本和高級的混合,中間有一個切片。 這是一個特殊的記錄案例,docs.scipy.org/doc/numpy/reference/…。 所有切片尺寸都被推到最后,在 boolean 索引之后。

因此,對於您的 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]是一個視圖,所以沒關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM