2016-03-24 4 views
0

В Python я хочу создать матрицу n-by-100, где значение n неизвестно в начале. Это создание включает последовательное добавление строки в матрицу. Код, который я пытался за это:Добавление строк в массив NumPy

x = numpy.zeros(100) 
while true: 
    y = loadrow(); # Load a 1-by-100 NumPy array for the new row 
    x = numpy.append(x, y, 0) 

Однако есть три проблемы с вышеизложенным, которые я имею затруднение решая:

  1. линия x = numpy.zeros(100) инициализирует матрицу с рядом 100 нулей. Тем не менее, я хочу, чтобы первая строка была первой, которую я загружаю. Как создать пустую матрицу, которая будет предоставляться только после того, как я добавлю первую строку?

  2. Строка x = numpy.append(x, y, 0) не добавляет еще одну строку к матрице x. Вместо этого он просто добавляет y в конец первой строки, чтобы создать еще более длинную строку. Но если я попробую x = numpy.append(x, y, 1), так что я присоединяюсь к оси 1, то получаю ошибку: TypeError: Required argument 'object' (pos 1) not found.

  3. Когда я последовательно добавляю строки, подобные этому, кажется, что я продолжаю делать копии исходного массива, который будет неэффективным по мере роста массива. Есть ли другой способ сделать это, когда я не знаю, какой будет размер финального массива?

Спасибо!

+0

смотрите мой ответ на подобный вопрос [здесь] (http://stackoverflow.com/questions/35818395/add-a-column- в-Numpy-массива-Python/35828879 # 35828879). – bunji

+1

Рассмотрите возможность использования списка и после цикла, преобразуйте его в массив numpy. – Evert

ответ

3

Если вы ДОЛЖНЫ использовать np.append вот способ сделать это

In [96]: arr=np.zeros((0,5),int) 

In [97]: for i in range(3): 
    arr=np.append(arr,np.arange(i,i+5).reshape(1,5),0) 
    ....:  

In [98]: arr 
Out[98]: 
array([[0, 1, 2, 3, 4], 
     [1, 2, 3, 4, 5], 
     [2, 3, 4, 5, 6]]) 

Честно говоря, я не люблю append. Люди путают его с добавлением списка (вы этого не сделали), люди не понимают размеры, и каждый раз он перестраивает массив.

Посмотрите на код - посмотрите, что он делает?

return concatenate((arr, values), axis=axis) 

Смотри также vstack, hstack. dstack и т.д.

Но еще лучше, список использования присоединять

In [100]: alist=[] 

In [101]: for i in range(3): 
    alist.append(np.arange(i,i+5).reshape(1,5)) 
    .....:  

In [102]: np.concatenate(alist,axis=0) 
Out[102]: 
array([[0, 1, 2, 3, 4], 
     [1, 2, 3, 4, 5], 
     [2, 3, 4, 5, 6]]) 
Смежные вопросы