2017-02-01 1 views
1

dataI ist der Form (80,336,336)Valueerror: konnte nicht Eingabearray Broadcast von Form (80.269.269) in Form (80.269.234)

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 

I z die skalierten Daten in großen Array platziert werden müssen. Indem Mittelpositionen, ich brauche die Daten zu platzieren (wenn Überschneidungen nehmen Durchschnitt dieser Werte)

Aber ich erhalte die folgenden Fehler:

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) 

Wie kann ich diesen Fehler beheben?

Antwort

0

Das Problem ist, dass Slicing über das Array erstrecken, in diesem Fall gehen können nur die Elemente, die in dem Ausmaß des Arrays sind zurückgegeben werden:

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

So Ihre Berechnung über die erweitern geht und damit die z[0:dataZ.shape[0],off[0]:off[0]+dimZ[1],off[1]:off[1]+dimZ[2]] ist nicht die Form, die Sie erwarten!

Ich habe einige Debug-Anweisungen:

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 

Dieses gedruckt:

[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)) 

Und was habe ich erwähnt, früher hier gilt: Die slice(560, 862, None) geht über die erweitern und somit fehlt Ihnen 62 Elemente in der zweiten Dimension:

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

Einfache Lösung: Inc Verkleinern Sie die Größe Ihres z!


Ein verwandtes Anmerkung: Sie wissen, dass // höhere Priorität als - hat? So

max(c-s//2,0)  # is equivalent to max(c-(s//2), 0) 
Verwandte Themen