python - 如何加载使用 numpy.savez_compressed 创建的文件?

标签 python numpy

我正在使用下面定义的 export_vectors 保存一个 numpy 数组。在此函数中,我加载以空格分隔的字符串值,然后将它们作为 float 存储在 numpy 数组中。

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)

这里的embeddingsfloat64类型的ndarray

虽然,然后在尝试加载文件时,使用:

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

尝试加载时出现错误:

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

这是为什么?

最佳答案

您可能错误地使用了open。 我怀疑,你需要给它一个标志来使用 binary-mode 就像( docs ):

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

文档解释了默认行为:通常,文件以文本模式打开,这意味着您从文件读取和写入字符串,这些字符串以特定编码进行编码。

但是你可以让它变得简单,只使用文件路径本身(因为 np.load 能够采用类似文件的对象、字符串或 pathlib.Path):

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

(一个简化的规则:所有使用通用压缩的东西总是使用二进制文件;而不是文本文件!)

关于python - 如何加载使用 numpy.savez_compressed 创建的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43282547/

相关文章:

python - 计算非零值的平均值

python - REINFORCE深度强化学习算法中的折扣奖励

python - 如何过滤掉包含特定字符串的 'set' 类型值的 pandas df 行?

python - 数据框中连续天数的平均值

python - 如何使用 "dynamic"代码减少此示例中的条件开销

python - 将 numpy 数组列表转换为单个 int numpy 数组

python - 将动态数字数组 reshape 为固定大小

python - numpy 向量化而不是 for 循环

numpy - 如何使用 Numpy 函数实现泄漏的 relu

python - Numpy 中 zeros 函数的性能