2017-02-01 79 views
1

dataI是形狀(80,336,336)ValueError異常:不能從廣播形狀(80269269)輸入陣列分成形狀(80269234)

z= np.zeros([80,800,800], dtype= dataI.dtype) 

v=np.zeros_like(z) 

centres = [(100,200),(400,100), (600,300), (500,400), (600,500)] 
zooms = [[1,1,1], [1,0.6,0.6], [1,0.7,0.7], [1,0.8,0.8], [1,0.9,0.9]] 

for cent,zoom in zip(centres,zooms): 

    dataZ = scipy.ndimage.zoom(dataI, zoom, order=3) 
    dimZ = dataZ.shape 
    off = [max(c-s//2,0) for c,s in zip(cent,dimZ)] 
    z[0:dataZ.shape[0],off[0]:off[0]+dimZ[1],off[1]:off[1]+dimZ[2]]=dataZ 

我需要放置經縮放的數據在大陣列z的。通過給中心位置,我需要把數據(如果重疊,把這些值的平均值)

,但我得到了以下錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    z[0:dataZ.shape[0],off[0]:off[0]+dimZ[1],off[1]:off[1]+dimZ[2]]=dataZ 

ValueError: could not broadcast input array from shape (80,269,269) into shape (80,269,234) 

我怎麼能解決這個問題?

回答

0

的問題是,切片可以去陣列延伸超出,在這種情況下,只有那些在擴展陣列的返回的元素:

>>> arr = np.ones((3, 3)) 
>>> arr[2:10, 2:10] # that doesn't have shape (8, 8)! 
array([[ 1.]]) 

所以你的計算超出延長,因此z[0:dataZ.shape[0],off[0]:off[0]+dimZ[1],off[1]:off[1]+dimZ[2]]是不是你期望它的形狀!

我加了一些調試語句:

from scipy import ndimage # better to import just submodules with scipy 

# what you did 

for cent, zoom in zip(centres, zooms): 
    dataZ = ndimage.zoom(dataI, zoom, order=3) 
    dimZ = dataZ.shape 
    off = [max(c - s // 2, 0) for c, s in zip(cent, dimZ)] 
    print(off) 
    print(np.s_[0:dataZ.shape[0],off[0]:off[0]+dimZ[1],off[1]:off[1]+dimZ[2]]) 
    z[0 : dataZ.shape[0], 
     off[0] : off[0] + dimZ[1], 
     off[1] : off[1] + dimZ[2]] = dataZ 

該印刷:

[60, 32] 
(slice(0, 80, None), slice(60, 396, None), slice(32, 368, None)) 
[360, 0] 
(slice(0, 80, None), slice(360, 562, None), slice(0, 202, None)) 
[560, 183] 
(slice(0, 80, None), slice(560, 795, None), slice(183, 418, None)) 
[460, 266] 
(slice(0, 80, None), slice(460, 729, None), slice(266, 535, None)) 
[560, 349] 
(slice(0, 80, None), slice(560, 862, None), slice(349, 651, None)) 

而我前面提到這裏適用:slice(560, 862, None)超越了擴展,因此你缺乏在第二62項目尺寸:

ValueError: could not broadcast input array from shape (80,302,302) into shape (80,240,302) 

Easy fix:Inc回覆你的z的大小!


相關提示:你知道//的優先級高於-?所以

max(c-s//2,0)  # is equivalent to max(c-(s//2), 0) 
相關問題