2017-04-07 3 views
0

Ich speichere ein numpy Array mit den folgenden export_vectors definiert unten. In dieser Funktion lade ich String-Werte, die durch Leerzeichen getrennt sind, und speichere sie dann als Floats in einem numply-Array.Wie lade ich eine Datei, die mit numpy.savez_compressed erstellt wurde?

def export_vectors(vocab, input_filename, output_filename, dim): 
    embeddings = np.zeros([len(vocab), dim]) 
    with open(input_filename) as f: 
     for line in f: 
      line = line.strip().split(' ') 
      word = line[0] 
      embedding = line[1:] 
      if word in vocab: 
       word_idx = vocab[word] 
       embeddings[word_idx] = np.asarray(embedding).astype(float) 

    np.savez_compressed(output_filename, embeddings=embeddings) 

Hier embeddings ist ein ndarray von float64 Typ.

Obwohl, dann beim Versuch, die Datei zu laden, mit:

def get_vectors(filename): 
    with open(filename) as f: 
     return np.load(f)["embeddings"] 

Beim Versuch, den Laden zu tun, erhalte ich die Fehlermeldung:

File "/usr/lib/python3.5/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x99 in position 10: invalid start byte

Warum ist das?

+1

Da die Datei z-komprimiert ist, verwenden Sie 'np.load (Dateiname)'. Mit anderen Worten, 'load' sorgt dafür, dass das komprimierte Archiv auf die richtige Weise geöffnet wird. – hpaulj

Antwort

3

Sie verwenden wahrscheinlich open falsch. Ich vermute, Sie brauchen, um ihm eine Fahne binary-Modus wie (docs) zu verwenden:

open(filename, 'rb') # r: read-only; b: binary 

docs erklären die default-Verhalten: Normally, files are opened in text mode, that means, you read and write strings from and to the file, which are encoded in a specific encoding.

Aber man kann es einfach machen und benutzen Sie einfach den Dateipfad selbst (als np.load der Lage ist, file-like object, string, or pathlib.Path zu nehmen):

np.load(filename) # This would be more natural 
        # as it's kind of the direct inverse of your save-code; 
        # -> no manual file-handling 

(Eine vereinfachte Regel: Alles, was eine allgemeine Komprimierung verwendet, arbeitet immer mit Binärdateien; keine Textdateien!)

Verwandte Themen