2011-12-29 3 views
1

У меня есть цикл, который добавляет элементы в 1d массиве:добавление Numpy вектора к Numpy многомерного массива

for i in range(0, 1000): 
     fvector[0, i] = function_value 

после завершения цикла, у меня есть 1 х 1000 вектор, который я хочу, чтобы хранить в многомерную матрицу fmatrix, которая составляет 50 x 1000. Мне удалось сделать это, используя цикл и копируя каждый элемент по отдельности - но он очень медленный. Затем я попытался использовать срез, чтобы скопировать весь вектор за один проход после цикла, а затем быть готовым скопировать следующий вектор в следующий столбец. Как я могу перейти к следующему столбцу? Я пробовал:

s=slice([i], None) 
    fmatrix[s] = fvector 

и различные комбинации для с, но я получаю сообщение об ошибке о создании элемента массива с последовательностью, или неправильным синтаксисом.

Я знаю, что это должно быть прямо вперед, но я новичок в питона, NumPy и массивы :-(

ответ

1

Попробуйте это. Выделяют матрицу, здесь нулевой инициализируется для эффекта:

>>> import numpy as np 
>>> fmatrix = np.zeros((50, 1000)) 

Тогда индекс в него, чтобы получить fvector:

>>> fvector = fmatrix[0] 

Присвоим fvector «s элементов:

>>> for i in xrange(1000): 
...  fvector[i] = i 

Если вы теперь проверьте fmatrix[0], первую строку fmatrix, вы увидите, что она была назначена в предыдущем цикле. Это потому, что индексирование строки NumPy создает fvector как вид на fmatrix первый ряд. Это избавит вас от копирования.

+0

Это ОЧЕНЬ аккуратный трюк! – wot

+0

Как переместиться на fmatrix [1], а затем до последней строки, не получив ошибку «index out of bounds»? – wot

+0

@wot: вы можете перебирать строки с помощью 'for fvector in fmatrix'; нет необходимости в индексировании. –

1

fvector имеет форму (1,1000). Это 2D массив, даже если одна ось имеет длину 1. Вы можете нарезать его вниз к массиву 1D с fvector[0,:]. Это дает первую строку.

fmatrix имеет форму (50,1000). Вы можете нарезать его вниз к массиву 1D с fmatrix[i,:]. Это дает i й строке.

Итак, чтобы присвоить значения в fi первый ряд fvector к i й строке fmatrix:

fmatrix[i,:] = fvector[0,:] 

Возможно, однако нет никакой необходимости fvector быть 2D массив? Может быть, просто сделать его 1D массив, чтобы начать с:

fvector = np.empty(1000) 
for i in range(0, 1000): 
    fvector[i] = function_value 

и тогда вы могли бы выполнить задание с

fmatrix[i,:] = fvector 
+0

Спасибо. Я понимаю, что мое замешательство в массивах 1d-2d, вероятно, вызывает проблемы и в других местах. – wot

+0

Я вернулся и изменил свои 2D массивы на 1D, и это действительно помогло с синтаксисом присваивания. Я использовал функцию просмотра larsmans для заполнения матрицы. Огромное спасибо обоим. – wot

Смежные вопросы