добавление векторной фигуры в многомерный массив - PullRequest
1 голос
/ 29 декабря 2011

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

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

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

Затем укажите в нем, чтобы получить fvector:

>>> fvector = fmatrix[0]

Затем присвойте элементам fvector:

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

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

1 голос
/ 29 декабря 2011

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

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

Таким образом, чтобы присвоить значения в первом ряду fvector i th строке fmatrix:

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

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

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

, а затем вы можете выполнить присвоение с помощью

fmatrix[i,:] = fvector
...