Вы можете использовать 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».