【问题标题】:Why does outputing numpy.dot to memmap does not work?为什么将 numpy.dot 输出到 memmap 不起作用?
【发布时间】:2018-07-21 04:24:20
【问题描述】:

如果我这样做:

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 = np.asarray(c) 有助于解决问题。 (github.com/numpy/numpy/issues/7124)

标签: python numpy


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

来自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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多