Почему вывод numpy.dot в memmap не работает?

If I do:

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: выходной массив неприемлем (должен иметь правильный тип, количество измерений и быть 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))

оно работает.

Что я делаю не так?


person RKI    schedule 01.09.2017    source источник
comment
Использование c = np.asarray(c) помогает решить проблему. (github.com/numpy/numpy/issues/7124)   -  person RKI    schedule 02.09.2017


Ответы (2)


Он не просто должен соответствовать dtype; он также должен иметь правильный тип, например type(c). c является экземпляром numpy.memmap, а не numpy.ndarray, поэтому проверка не выполняется.

Как рекомендовано в numpy.memmap документах, вместо этого вы можете используйте mmap.mmap для сопоставления файла и создайте numpy.ndarray, поддерживаемый mmap, в качестве его буфера. Вы можете посмотреть на numpy.memmap реализацию посмотреть, что может быть связано с этим.

person user2357112 supports Monica    schedule 01.09.2017
comment
Мне удалось заставить его работать с формой подсказок: github.com/numpy/numpy/issues/ 7124. Я использовал c = np.asarray(c). - person RKI; 02.09.2017

Из комментария RKI использование 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.
person dllahr    schedule 20.07.2018