Получение индекса столбца в NumPy - PullRequest
0 голосов
/ 06 октября 2019

Я довольно новичок в NumPy и ищу способ получить индекс текущего столбца, который я повторяю в матрице.

import numpy as np

#sum of elements in each column
def p_b(mtrx):
    b = []
    for c in mtrx.T:
        summ = 0
        for i in c:
            summ += i
        b.append(summ)
    return b

#return modified matrix where each element is equal to itself divided by
#the sum of the current column in the original matrix
def a_div_b(mtrx):
    for c in mtrx:
        for i in c:
            #change i to be i/p_b(mtrx)[index_of_a_current_column]
    return mtrx

Для ввода ([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) результат будет ([[1/12, 2/12, 3/12], [4/15, 5/15, 6/15], [7/18, 8/18, 9/18]]).

Любые идеи о том, как мне этого добиться?

1 Ответ

0 голосов
/ 06 октября 2019

Вам не нужны эти функции и циклы для этого. Те не будут эффективными. При использовании 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 дает транспонированную матрицу. Вам нужно транспонировать, чтобы выполнить деление на правильную ось, а затем транспонировать обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...