Как заполнить многомерный массив с помощью уравнения в python - PullRequest
2 голосов
/ 08 марта 2020

Я новичок в python, и я хотел бы заполнить Numpy многомерный массив, используя уравнение. В Fortran я могу использовать индекс массива, чтобы заполнить его, это можно сделать в python? Скажем, у меня есть уравнение a = i * j, где i и j - позиция строки и столбца соответственно. Так что, если у меня есть массив n на n, тогда массив будет заполнен результатами уравнения, поэтому первое значение будет 1, поскольку a = 1 * 1 и так далее.

Ответы [ 2 ]

2 голосов
/ 08 марта 2020

Вы можете использовать numpy широковещание , чтобы получить этот результат:

i = np.arange(3)[:, np.newaxis]  # (3, 1)
# array([0, 1, 2])
j = np.arange(4)[np.newaxis, :]  # (1, 4)
# array([0, 1, 2, 3])
arr = i * j                      # (3 ,4)
# array([[0, 0, 0, 0],
#        [0, 1, 2, 3],
#        [0, 2, 4, 6]])

Вы можете выполнить большинство вычислений, которые вам нужны, с индексными массивами i [n x 1] и j [1 x m], и результат всегда будет [n x m]

arr = np.sin(i)**2 + np.cos(i)**2 + (j-i)
# array([[ 1.,  2.,  3.,  4.],
#        [ 0.,  1.,  2.,  3.],
#        [-1.,  0.,  1.,  2.]])

Вы также можете использовать np.meshgrid(), чтобы явно повторять индексы вдоль другое измерение для получения полных 2d-массивов для i и j:

i, j = np.meshgrid(np.arange(3), np.arange(4), indexing='ij')
# i
# array([[0, 1, 2, 3],
#        [0, 1, 2, 3],
#        [0, 1, 2, 3]])
# j
# array([[0, 0, 0, 0],
#        [1, 1, 1, 1],
#        [2, 2, 2, 2]])

arr = i * j
# array([[0, 0, 0, 0],
#        [0, 1, 2, 3],
#        [0, 2, 4, 6]])

Это хорошая визуализация того, что происходит во время трансляции автоматически.

Обратите внимание на аргумент индексации ij np.meshgrid() для матричной индексации; из документов:

Задание строки «ij» возвращает сетку с матричной индексацией, а «xy» возвращает сетку с декартовой индексацией. В двумерном случае с входами длиной M и N выходы имеют форму (N, M) для индексации «xy» и (M, N) для индексации «ij».

0 голосов
/ 08 марта 2020

Чтобы сделать a=i*j или что-то подобное, лучше сначала создать массив, содержащий i значения и массив, содержащий j значения, а затем просто сделать a=i*j:

Для Например, если вы хотите матрицу 5 x 10:

import numpy as np

i, j = np.meshgrid(np.arange(5), np.arange(10))
a = i * j

Результат:

array([[ 0,  0,  0,  0,  0],
       [ 0,  1,  2,  3,  4],
       [ 0,  2,  4,  6,  8],
       [ 0,  3,  6,  9, 12],
       [ 0,  4,  8, 12, 16],
       [ 0,  5, 10, 15, 20],
       [ 0,  6, 12, 18, 24],
       [ 0,  7, 14, 21, 28],
       [ 0,  8, 16, 24, 32],
       [ 0,  9, 18, 27, 36]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...