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

Python 为什么将numpy.dot输出到memmap不起作用?,python,numpy,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数组) 我检查了错误消息中的所有条件,它们似乎符合: >>> print(a.dtype

如果我这样做:

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数组)

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

>>> 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 = np.zeros((10,10))
它起作用了


我做错了什么?

它不仅仅需要匹配数据类型;它还必须具有正确的类型,如
类型(c)
c
numpy.memmap
实例,而不是
numpy.ndarray
,因此检查失败

按照中的建议,您可以使用
mmap.mmap
来映射文件,并创建一个由mmap支持的
numpy.ndarray
作为其缓冲区。您可以查看以了解执行此操作可能涉及的内容。

在注释中,使用
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.

我能够使它与提示表单一起工作:。我使用c=np.asarray(c)。使用c=np.asarray(c)有助于解决问题。(github.com/numpy/numpy/issues/7124)