У меня есть словарь с множественными массивами в качестве значений. Я хочу изменить эти массивы, добавив в конце один дополнительный элемент. Поскольку массивы numpy для этого не подходят, я сначала конвертирую массивы в списки, а затем добавляю значение p в конец.
Однако, когда я запускаю эту функцию, потребление памяти удваивается, как если бы массивы были скопированы, а не изменены на месте.
Вот код:
def add_coordinates(my_Dict):
n = 0
for key in my_Dict.keys():
# Convert values of each key to a list. In place?
my_Dict[key] = [list(s) for s in my_Dict[key]]
del s
for index in range(len(my_Dict[key])):
p = [float(index)/len(my_Dict[key])]
my_Dict[key][index] = my_Dict[key][index] + p
my_Dict[key] = np.array(my_Dict[key])
return my_Dict
После предложения создать новый массив numpy с расширенным измерением, а затем добавить новое значение, я изменил код следующим образом:
def add_coordinates(my_Dict):
for key in my_Dict.keys():
tmp = np.zeros((my_Dict[key].shape[0],my_Dict[key].shape[1]+1))
tmp[:,:-1] = my_Dict[key]
for index in range(len(my_Dict[key])):
tmp[index,-1] = float(index)/len(my_Dict[key])
my_Dict[key] = tmp
return my_Dict
В качестве третьего варианта я использую np.concatenate, чтобы добавить новое измерение в массивы th numpy:
def add_coordinates(my_Dict):
for key in my_Dict.keys():
coords = np.zeros((my_Dict[key].shape[0],1))
for index in range(my_Dict[key].shape[0]):
coords[index] = float(index)/my_Dict[key].shape[0]
my_Dict[key] = np.concatenate((my_Dict[key],coords),axis=1)
return my_Dict
Но np.concatenate также делает копию.
Все эти варианты удваивают требования к памяти. Есть ли способ сделать это без копирования исходных массивов и внести все изменения на месте?
Почему бы вам не заменить свой массив numpy новым массивом на месте, т.е. создать массив с n + 1 значениями и my_dict [i] = newarray
@NiteyaShah Я пробовал это (включил код в вопрос), но создание нового массива numpy для замены старого, похоже, не удаляет старый из памяти ...
Это похоже на возможный вариант использования numpy.append.
@ user2357112 numpy.append также генерирует копию .. так же, как numpy.insert
@hirschme: Да, но он копирует гораздо меньше, чем то, что вы делаете сейчас.
Это внутренняя проблема всех языков, в которых есть сборка мусора, и я не думаю, что есть какой-либо предлагаемый способ удаления объектов из памяти, единственные две вещи, о которых я могу думать сейчас, - это слабая ссылка на docs.python.org/3/library/weakref.html#example и сохранение большого массива numpy по умолчанию и вместо того, чтобы увеличивать его, просто замените его индексом, но я считаю, что это не очень эффективно с точки зрения памяти. Ссылка на объект Python почти всегда создает дубликаты, если это серьезная проблема, может быть, реализовать эту часть кода на C? Это, безусловно, будет хорошим приростом производительности






Когда вы конвертируете в списки, вы делаете копию данных, для начала