Вам не нужны эти функции и циклы для этого. Те не будут эффективными. При использовании numpy
используйте векторизованные операции всегда, когда это возможно (в большинстве случаев это возможно). NumPy Broadcast правила используются для выполнения математических операций между массивами разных измерений, когда это возможно, так что вы можете использовать векторизацию, которая гораздо более эффективна, чем циклы Python.
В вашем случае,скажем, что ваш массив arr
:
arr = np.arange(1, 10)
arr.shape = (3, 3)
#arr is:
>>> arr
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
вы можете достичь желаемого результата с помощью:
res = (arr.T / arr.sum(axis=0)).T
>>> res
array([[0.08333333, 0.16666667, 0.25 ],
[0.26666667, 0.33333333, 0.4 ],
[0.38888889, 0.44444444, 0.5 ]])
numpy sum позволяет суммировать ваш массив позаданная ось, если задан параметр axis
. 0 - это внутренняя ось, которую вы хотите суммировать.
.T
дает транспонированную матрицу. Вам нужно транспонировать, чтобы выполнить деление на правильную ось, а затем транспонировать обратно.