Как найти максимум сумм абсолютных значений каждого столбца в матрице - PullRequest
0 голосов
/ 16 апреля 2020

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

Например, учитывая следующий массив, я Я хочу получить ответ 2.7657527806024733.

A = np.array([[0.94369777, 0.34434054, 0.80366952, 0.665736],
              [0.82367659, 0.13791176, 0.6993436, 0.44473609],
              [0.82337673, 0.56936686, 0.46648214, 0.50403736]])

Это код, который у меня есть:

def L1Norm(M):
    x = 0
    S = np.shape(M)
    N = S[0]
    P = S[1]
    answer = np.zeros((1, P))
    for j in range(P):
        t = 0
        for i in M:
            t += np.abs(i[j])
        answer = np.append(answer, t)
    s = np.shape(answer)
    n = s[0]
    p = s[1]
    for j in range(p):
        if answer[0][j] > x:
            x = answer[0][j]
    return x

Но я получаю следующую ошибку:

IndexError                                Traceback (most recent call last)
<ipython-input-113-e06e08ab836c> in <module>
----> 1 L1Norm(A)

<ipython-input-112-624908415c12> in L1Norm(M)
     12     s = np.shape(answer)
     13     n = s[0]
---> 14     p = s[1]
     15     for j in range(p):
     16         if answer[0][j] > x:

IndexError: tuple index out of range

Любой идеи о том, как я мог это исправить?

Ответы [ 5 ]

2 голосов
/ 16 апреля 2020

Вот мое решение. Я l oop над столбцами и pu sh каждая сумма в массив. Затем il oop над этим массивом, чтобы найти наибольшее значение. Это очень многословно, но не использует numpy ни для чего, кроме создания матрицы.

import numpy as np

matrix = np.array([[0.94369777, 0.34434054, 0.80366952, 0.665736],
       [0.82367659, 0.13791176, 0.6993436, 0.44473609],
       [0.82337673, 0.56936686, 0.46648214, 0.50403736]])

matrixShape = np.shape(matrix)

i = 0
j = 0

sumsOfColumns = []

while j < matrixShape[1]:
    sumOfElems = 0
    i = 0
    while i < matrixShape[0]:
        sumOfElems += matrix[i,j]
        i += 1
    sumsOfColumns.append(sumOfElems)
    j += 1

print(sumsOfColumns)

maxValue = 0

for value in sumsOfColumns:
    if value > maxValue:
        maxValue = value

print(maxValue)    

repl: https://repl.it/@ShroomCode / FrequentFunnyDisplaymanager

1 голос
/ 16 апреля 2020

Если вы хотите получить максимальную сумму столбцов, вот супер простой подход с использованием pandas.DataFrame:

import numpy as np
import pandas as pd

vals = np.array([[0.94369777, 0.34434054, 0.80366952, 0.665736],
                 [0.82367659, 0.13791176, 0.6993436, 0.44473609],
                 [0.82337673, 0.56936686, 0.46648214, 0.50403736]])

# Store values to a DataFrame.
df = pd.DataFrame(vals)
# Get the max of column sums.
max_sum = df.sum(axis=0).max()

как функции:

def max_col_sum(vals):
    max_sum = pd.DataFrame(vals).sum(axis=0).max()
    return max_sum

Вывод:

2.59075109
1 голос
/ 16 апреля 2020

С помощью numpy вы можете получить каждый столбец в виде массива, используя my_np_array[:,column_number]

Таким образом, используя это, вы можете сделать для l oop:

sums = []
for i in range(0, np.shape(my_np_array)[0] + 1):
    sums.append(sum(my_np_array[:,i]))

max_sum = max(sums)

Чтобы решить без numpy мы можем go через каждую строку добавить каждое значение к соответствующему столбцу:

0 голосов
/ 16 апреля 2020

Пожалуйста, попробуйте следующее? -

A.sum(0).max()   

или

max(sum(A))

Оба должны дать вам желаемый ответ!

0 голосов
/ 16 апреля 2020

Простой ответ с использованием zip, np.sum

Код

def L1Norm(M):
  return max([np.sum(column) for column in zip(*M)])for column in zip(*M)]

Результат

2.59075109

Объяснение

Понимание списка для l oop по данным в каждом столбце с:

[... для столбца в zip (* M)]

Суммируйте значения столбца с помощью

np.sum(column)

Вычислите максимальное значение для понимания списка с помощью:

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