Мое впечатление, что в NumPy два массива могут использовать одну и ту же память. Рассмотрим следующий пример:Есть ли способ проверить, имеют ли массивы NumPy одни и те же данные?
import numpy as np
a=np.arange(27)
b=a.reshape((3,3,3))
a[0]=5000
print (b[0,0,0]) #5000
#Some tests:
a.data is b.data #False
a.data == b.data #True
c=np.arange(27)
c[0]=5000
a.data == c.data #True (Same data, not same memory storage), False positive
Так ясно b
не сделать копию a
; он просто создал несколько новых метаданных и привязал их к тому же буферу памяти, который использует a
. Есть ли способ проверить, ссылаются ли на два массива один и тот же буфер памяти?
Мое первое впечатление заключалось в использовании a.data is b.data
, но это возвращает false. Я могу сделать a.data == b.data
, который возвращает True, но я не думаю, что проверяет, чтобы убедиться, что a
и b
используют один и тот же буфер памяти, только тот блок памяти, на который ссылается a
, и тот, на который ссылаются b
, имеет одинаковые байты.
Вот наиболее актуальный ранее задаваемый вопрос: http://stackoverflow.com/questions/10747748/how-do-i-check-that-two-slices-of-numpy-arrays-are-the-same- или перекрытие –
@RobertKern - Спасибо. Я действительно видел эту запись, но поскольку я не мог найти документацию для 'numpy.may_share_memory' (кроме встроенной' help'), я думал, что может быть что-то еще - например. 'Numpy.uses_same_memory_exactly'. (мой вариант использования немного менее общий, чем другой, поэтому я подумал, что может быть более окончательный ответ). В любом случае, увидев ваше имя в нескольких списках рассылки, я предполагаю, что ответ «нет такой функции». – mgilson
'numpy.may_share_memory()' не отображается в справочном руководстве только из-за аварии организации справочного руководства. Это правильная вещь. К сожалению, в данный момент функция 'uses_same_memory_exactly()' не существует. Для реализации такой функции требуется решение ограниченного линейного диофантова уравнения, NP-жесткая задача. Размер проблемы обычно не слишком велик, но просто записывать алгоритм раздражает, поэтому он еще не выполнен. Если мы это сделаем, он будет включен в 'numpy.may_share_memory() ', поэтому я рекомендую использовать. –