Numpy不会创建二进制文件

时间:2017-07-19 14:14:01

标签: python numpy

尝试将numpy矩阵M写入二进制文件时:

from io import open
X = [random.randint(0, 2 ** self.stages - 1)for _ in range(num)]
Matrix = np.asarray([list(map(int, list(x))) for x in X])

file_output = open('result.bin', 'wb')
M = np.ndarray(Matrix, dtype=np.float64)
file_output.write(M)
file_output.close()

我收到此错误:

Traceback (most recent call last):
  File "experiments.py", line 164, in <module>
    write_data(X, y)
  File "experiments.py", line 39, in write_data
    arr = np.ndarray(Matrix, dtype=np.float64)
ValueError: sequence too large; cannot be greater than 32

我可以知道如何解决这个问题吗?谢谢

2 个答案:

答案 0 :(得分:1)

您可以通过以下两种方式之一完成此操作:

import numpy as np

a = np.random.normal(size=(10,10))
a.tofile('test1.dat')

with open('test2.dat', 'wb') as f:
    f.write(a.tobytes())

# diff test1.dat test2.dat

请参阅tofile的文档。但是,从原始示例来看,Matrix似乎无法转换为ndarray

答案 1 :(得分:1)

替换:

M = np.ndarray(Matrix, dtype=np.float64)

M = Matrix.astype(np.float64)

np.array(Matrix, dtype=np.float64)也可以,但astype更简单。

我在重新创建Matrix变量时遇到了一些问题。它的形状是什么?

np.save是将多维数组保存到文件的最佳方法。还有其他方法,但它们不保存形状和dtype信息。

ndarray是错误的,因为第一个(位置)参数应该是形状,而不是另一个数组。 buffer参数中提供了数据(如果有)。 ndarray通常不会被初学者或高级numpy用户使用。

Matrix应该是什么。当我使用几个参数尝试您的代码时,我在map步骤中收到错误:

In [495]: X = [np.random.randint(0, 2 ** 2 - 1)for _ in range(4)]
     ...: Matrix = np.asarray([list(map(int, list(x))) for x in X])
     ...: 
-----> 2 Matrix = np.asarray([list(map(int, list(x))) for x in X])
....
TypeError: 'int' object is not iterable
In [496]: X
Out[496]: [1, 2, 1, 0]

X只是一个数字列表吗?不是某种数组列表?为什么Matrix步骤?它是否试图将嵌套的列表列表转换为整数?即使randint已经创建了整数?然后,您转换为float