Python: как преобразовать сложный массив в двумерный массив? - PullRequest
1 голос
/ 16 марта 2011

Как программист C ++, я привык обращаться к векторам в стиле C ++:

for (i=0; i<max_x; i++) {
  for (j=0; j<max_y; j++) {
    vec[i][j] = real(complex_number(j+i*max_x))
  }
}

Теперь у меня в Python

    x = np.linspace(x1, x2, step)
    y = np.linspace(y1, y2, step)
    X, Y = np.meshgrid(x, y)
    Z = x + 1j*y

    for z in Z:
      FZ = complex_function(z)

Как я могу выполнить то же самое, что и код C ++, "питоническим" способом? Спасибо

РЕДАКТИРОВАТЬ: проверяя функцию изменения формы и повторно анализируя мой код, я заметил проблему с преобразованиями из 2D-массивов в 1D-массивы и обратно. Основная проблема в том, что у меня есть функция, которая принимает сложный массив z_list и возвращает сложный массив. Мне нужно нанести это на сетку, и я планировал использовать matplotlib, но для matplotlib нужен 2D-массив, каждая точка которого имеет значение. Как я могу сделать это без генерации двухмерного массива, преобразования его в одномерный массив и изменения формы массива обратно в двухмерный? Спасибо.

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Используйте reshape, чтобы превратить одномерный массив в 2D (или любую другую фигуру).

>>> x_max = 12
>>> y_max = 4
>>> vec1d = np.arange(x_max*y_max, dtype=complex)
>>> vec1d.reshape([x_max, y_max])
array([[  0.+0.j,   1.+0.j,   2.+0.j,   3.+0.j],
       [  4.+0.j,   5.+0.j,   6.+0.j,   7.+0.j],
       [  8.+0.j,   9.+0.j,  10.+0.j,  11.+0.j],
       [ 12.+0.j,  13.+0.j,  14.+0.j,  15.+0.j],
       [ 16.+0.j,  17.+0.j,  18.+0.j,  19.+0.j],
       [ 20.+0.j,  21.+0.j,  22.+0.j,  23.+0.j],
       [ 24.+0.j,  25.+0.j,  26.+0.j,  27.+0.j],
       [ 28.+0.j,  29.+0.j,  30.+0.j,  31.+0.j],
       [ 32.+0.j,  33.+0.j,  34.+0.j,  35.+0.j],
       [ 36.+0.j,  37.+0.j,  38.+0.j,  39.+0.j],
       [ 40.+0.j,  41.+0.j,  42.+0.j,  43.+0.j],
       [ 44.+0.j,  45.+0.j,  46.+0.j,  47.+0.j]])
1 голос
/ 16 марта 2011

Вместо того, чтобы делать Z = x + 1j*y, а затем изменять форму, вы можете сделать:

Z = np.zeros((ydim, xdim), dtype=complex)
Z.real, Z.imag = X, Y

, который, я думаю, мог бы быть более эффективным (всего операций меньше).

0 голосов
/ 16 марта 2011

Использование изменить форму

>>> Z.reshape(5,10)
array([[  0.00000000 +0.j        ,   0.20408163 +0.20408163j,
          0.40816327 +0.40816327j,   0.61224490 +0.6122449j ,
          0.81632653 +0.81632653j,   1.02040816 +1.02040816j,
          1.22448980 +1.2244898j ,   1.42857143 +1.42857143j,
          1.63265306 +1.63265306j,   1.83673469 +1.83673469j],
       [  2.04081633 +2.04081633j,   2.24489796 +2.24489796j,
          2.44897959 +2.44897959j,   2.65306122 +2.65306122j,
          2.85714286 +2.85714286j,   3.06122449 +3.06122449j,
          3.26530612 +3.26530612j,   3.46938776 +3.46938776j,
          3.67346939 +3.67346939j,   3.87755102 +3.87755102j],
       [  4.08163265 +4.08163265j,   4.28571429 +4.28571429j,
          4.48979592 +4.48979592j,   4.69387755 +4.69387755j,
          4.89795918 +4.89795918j,   5.10204082 +5.10204082j,
          5.30612245 +5.30612245j,   5.51020408 +5.51020408j,
          5.71428571 +5.71428571j,   5.91836735 +5.91836735j],
       [  6.12244898 +6.12244898j,   6.32653061 +6.32653061j,
          6.53061224 +6.53061224j,   6.73469388 +6.73469388j,
          6.93877551 +6.93877551j,   7.14285714 +7.14285714j,
          7.34693878 +7.34693878j,   7.55102041 +7.55102041j,
          7.75510204 +7.75510204j,   7.95918367 +7.95918367j],
       [  8.16326531 +8.16326531j,   8.36734694 +8.36734694j,
          8.57142857 +8.57142857j,   8.77551020 +8.7755102j ,
          8.97959184 +8.97959184j,   9.18367347 +9.18367347j,
          9.38775510 +9.3877551j ,   9.59183673 +9.59183673j,
          9.79591837 +9.79591837j,  10.00000000+10.j        ]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...