Определите пару массивов:
In [6]: x = np.arange(3); y = np.arange(10,13)
In [7]: x,y
Out[7]: (array([0, 1, 2]), array([10, 11, 12]))
Попробуйте простую функцию 2
In [8]: x + y
Out[8]: array([10, 12, 14])
Поскольку они имеют одинаковый размер, они могут суммироваться (или иным образом комбинироваться) поэлементно Результат имеет ту же форму, что и 2 входа.
Теперь попробуйте «трансляция». x[:,None]
имеет форму (3,1)
In [9]: x[:,None] + y
Out[9]:
array([[10, 11, 12],
[11, 12, 13],
[12, 13, 14]])
Результат (3,3): первые 3 из измененных x
, вторые из y
.
Я могу сгенерировать пару массивов с помощью meshgrid
:
In [10]: I,J = np.meshgrid(x,y,sparse=True, indexing='ij')
In [11]: I
Out[11]:
array([[0],
[1],
[2]])
In [12]: J
Out[12]: array([[10, 11, 12]])
In [13]: I + J
Out[13]:
array([[10, 11, 12],
[11, 12, 13],
[12, 13, 14]])
Обратите внимание на добавленные параметры в meshgrid
. Вот так мы и собираемся генерировать 2d-значения из пары 1d-массивов.
Теперь посмотрим, что делает sum
. Как вы используете это в функции:
In [14]: np.sum(I + J)
Out[14]: 108
результат - скаляр. Смотрите документы. Если я укажу axis
, я получу массив.
In [15]: np.sum(I + J, axis=0)
Out[15]: array([33, 36, 39])
Если вы дали V_func
права x
и y
, sum_list
может быть трехмерным массивом. Эта без оси sum
уменьшает ее до скаляра.
В таком коде вам нужно отслеживать формы массива. Включите тестовые распечатки, если это необходимо; не предполагайте ничего; Попробуй это. Обратите внимание на то, как размеры увеличиваются и уменьшаются при прохождении через различные операции.