2016-10-26 3 views
1

Ich versuche, die folgende Funktion zu verwenden:numpy.unique Fehler werfen

def randomChose(bp, xsteps, ysteps, bs): 
    # Number of points to be chosen 
    s = int((bp * xsteps * ysteps)/(bs * bs)) 

    # Generating an array representing the input indexes 
    indices = numpy.arange(xsteps * ysteps) 

    # Resampling without replacement 
    cs = npr.choice(indices, size=s, replace=False) 

    f = [] 
    for idx in cs: 
     nb = indices[max(idx-(bs*bs/2), 0):min(idx+(bs*bs/2)+1, xsteps*ysteps)] 
     f.append(nb) 
    f = numpy.array(f).flatten() 
    fix = numpy.unique(numpy.array(f)) 

    return fix 

, die als Parameter eine Zahl bp nimmt, XSteps die Datendimension * ysteps und ein% bs.

Was ich tun möchte, ist eine Anzahl von gültigen Indizes unter Berücksichtigung einiger Nachbarschaft in diesem Bild zu wählen.

Allerdings habe ich immer empfangen Fehler beim numpy.unique Aufruf, nicht immer, aber:

ValueError        Traceback (most recent call last) 
<ipython-input-35-1b5914c3cbc7> in <module>() 
     9  svf_y = [] 
    10  for s in range(samples): 
---> 11   fix = randomChose(bp, xsteps, ysteps, bs) 
    12   rs_z0, rs_z1, rs_z2 = interpolate(len(fix), xsteps, ysteps, mean_rs) 
    13   ds_z0, ds_z1, ds_z2 = interpolate(len(fix), xsteps, ysteps, mean_ds) 

<ipython-input-6-def08adce84b> in randomChose(bp, xsteps, ysteps, bs) 
    14   f.append(nb) 
    15  f = numpy.array(f).flatten() 
---> 16  fix = numpy.unique(numpy.array(f)) 
    17 
    18  return f 

/usr/local/lib/python2.7/dist-packages/numpy/lib/arraysetops.pyc in unique(ar, return_index, return_inverse, return_counts) 
    198   ar.sort() 
    199   aux = ar 
--> 200  flag = np.concatenate(([True], aux[1:] != aux[:-1])) 
    201 
    202  if not optional_returns: 

ValueError: all the input arrays must have same number of dimensions 

Dies ist, wie ich es nennen:

nx = 57.2 
ny = 24.0 
xsteps = 144 
ysteps = 106 
bs = 5  # Block size 
bp = 0.1 # Percentage of blocks 
fix = randomChose(bp, xsteps, ysteps, bs) 

Ich versuche zu verstehen, was falsch ist. Soweit ich verstanden habe, erwarten solche Methoden eine ndarray als Eingabe, die gegeben wird.

Vielen Dank für jede Hilfe.

Antwort

2

Erstens:

f.append(nb) 

sollte worden:

f.append(list(nb)) 

Die fa Liste von Listen macht, dass Numpy eine Chance hat, werden zu einem Numpy Array von ganzen Zahlen zu konvertieren, aber nur, wenn alle Listen haben die gleiche Länge. Wenn nicht, haben Sie nur ein eindimensionales Numpy-Array von Listen, und flatten() hat keine Wirkung.

Sie können eine

print(type(f[0])) 

nach dem Abflachen hinzufügen.

+0

Vielen Dank, @Balzola. Kannst du mir sagen, was falsch ist, wenn ich eine Liste von ndarrays erstelle und versuche, sie in ein ndarray umzuwandeln und es zu verflachen? – pceccon

+1

Hum ... eigentlich nichts. Dachte, du benutzt den Bereich statt np.arange. Mein Fehler. Aber dann hast du noch eine Liste von ND-Arrays. Wenn sie nicht alle die gleiche Form haben, macht numpy.array (f) Sie zu einem ndarray von ndarrays _objects_. Das ist also kein ndarray von ganzen Zahlen. flatten() hat keine Wirkung, da das Array bereits eine Dimension hat. – Balzola

0

Das Problem ist mit den Kanten. Z. B. wenn idx=0,

nb = indices[max(idx-(bs*bs/2), 0):min(idx+(bs*bs/2)+1, xsteps*ysteps)] 

wird [0] sein - das heißt, mit nur einem Wert anstelle einer xy-Koordinate. Dann können Sie Ihr Array nicht richtig abflachen.