Если Вы не хотите к (или не может) реализовывать IDisposable на Вашем классе, можно вызвать сборку "мусора" как это (но это медленно) -
GC.Collect();
NumPy действительно имеет функцию append , которая, похоже, может делать то, что вы хотите, например,
import numpy as NP
my_data = NP.random.random_integers(0, 9, 9).reshape(3, 3)
new_col = NP.array((5, 5, 5)).reshape(3, 1)
res = NP.append(my_data, new_col, axis=1)
ваш второй фрагмент (hstack) будет работать, если вы добавите еще один строка, например,
my_data = NP.random.random_integers(0, 9, 16).reshape(4, 4)
# the line to add--does not depend on array dimensions
new_col = NP.zeros_like(my_data[:,-1]).reshape(-1, 1)
res = NP.hstack((my_data, new_col))
hstack
дает тот же результат, что и concatenate ((my_data, new_col), axis = 1)
, я не уверен, как они сравнивают производительность.
Хотя это наиболее прямой ответ на ваш вопрос, я должен упомянуть, что цикл по источнику данных для заполнения цели через append , хотя это нормально в python, не является идиоматическим NumPy. Вот почему:
инициализация массива NumPy относительно дорога , и с этим традиционным шаблоном Python вы несете эти затраты, более или менее, на каждой итерации цикла (т. Е. просто создайте одну намного больше, чем вам нужно, и обрежьте `` неиспользованные '' части когда вы закончите его заполнение
>>> M[:3,:3]
array([[ 9., 3., 1.],
[ 9., 6., 8.],
[ 9., 7., 5.]])
Как правило, перераспределять массив NumPy - дорого, поэтому ваше третье решение действительно является лучшим с точки зрения производительности.
Однако я думаю, что hstack
будет делать то, что вы хотите - реплика в сообщении об ошибке,
ValueError: массивы должны иметь одинаковое количество измерений`
Я предполагаю, что newColumn имеет двухмерный (а не одномерный вектор), поэтому вам нужны данные, которые также должны иметь два измерения ... например, data = np. array ([[]])
- или, альтернативно, сделать newColumn одномерным вектором (обычно, если вещи одномерные, лучше оставить их одномерными в NumPy, чтобы широковещательная передача и т. д. работала лучше). В этом случае используйте np.squeeze (newColumn)
и hstack
или vstack
, которые должны работать с вашим исходным определением данных.
Обычно вы не меняете размер массива NumPy при его создании. Что вам не нравится в вашем третьем решении? Если это очень большая матрица / массив, то, возможно, стоит выделить массив до того, как вы начнете назначать его значения:
x = len(something)
y = getColumnDataAsNumpyArray.someLengthProperty
data = numpy.zeros( (x,y) )
for i in something:
data[i] = getColumnDataAsNumpyArray(i)