Рост матриц по столбцам в NumPy

Если Вы не хотите к (или не может) реализовывать IDisposable на Вашем классе, можно вызвать сборку "мусора" как это (но это медленно) -

GC.Collect();
20
задан Peter Mortensen 12 December 2010 в 15:43
поделиться

3 ответа

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.]])
18
ответ дан 30 November 2019 в 00:52
поделиться

Как правило, перераспределять массив NumPy - дорого, поэтому ваше третье решение действительно является лучшим с точки зрения производительности.

Однако я думаю, что hstack будет делать то, что вы хотите - реплика в сообщении об ошибке,

ValueError: массивы должны иметь одинаковое количество измерений`

Я предполагаю, что newColumn имеет двухмерный (а не одномерный вектор), поэтому вам нужны данные, которые также должны иметь два измерения ... например, data = np. array ([[]]) - или, альтернативно, сделать newColumn одномерным вектором (обычно, если вещи одномерные, лучше оставить их одномерными в NumPy, чтобы широковещательная передача и т. д. работала лучше). В этом случае используйте np.squeeze (newColumn) и hstack или vstack , которые должны работать с вашим исходным определением данных.

1
ответ дан 30 November 2019 в 00:52
поделиться

Обычно вы не меняете размер массива NumPy при его создании. Что вам не нравится в вашем третьем решении? Если это очень большая матрица / массив, то, возможно, стоит выделить массив до того, как вы начнете назначать его значения:

x = len(something)
y = getColumnDataAsNumpyArray.someLengthProperty

data = numpy.zeros( (x,y) )
for i in something:
   data[i] = getColumnDataAsNumpyArray(i)
4
ответ дан 30 November 2019 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: