为什么输出numpy.dot到memmap不起作用?

时间:2017-09-01 21:43:29

标签: python numpy

如果我这样做:

a = np.ones((10,1))
b = np.ones((10,1))
c = np.memmap('zeros.mat', dtype=np.float64, mode='w+', shape=(10,10), order='C')

a.dot(b.T, out=c)

我得到了:

  

ValueError:输出数组不可接受(必须具有正确的类型,   nr维度,并且是C-Array)

我检查错误消息中的所有条件,它们似乎适合:

>>> print(a.dtype == b.dtype == c.dtype)
>>> print(np.dot(a, b.T).shape == c.shape)
>>> print(c.flags['C_CONTIGUOUS'])

True
True
True

当我用c替换c时:

c = np.zeros((10,10))

它有效。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

它不必匹配dtype;它还必须具有正确的类型,如type(c)中所示。 cnumpy.memmap个实例,而不是numpy.ndarray,因此检查失败。

根据numpy.memmap docs的建议,您可以使用mmap.mmap映射文件并创建由mmap支持的numpy.ndarray作为其缓冲区。您可以查看numpy.memmap implementation以查看可能涉及的内容。

答案 1 :(得分:0)

RKI's条注释中,直接使用numpy.asarray是有效的,例如:

a = np.ones((10,1))
b = np.ones((10,1))

c_memmap = np.memmap('zeros.mat', dtype=np.float64, mode='w+', shape=(10,10), order='C')
c = numpy.asarray(c_memmap)

a.dot(b.T, out=c)

c_memmap.flush()
#etc.