Как перемножить элементы строки в матрице, которые принадлежат диапазону [a,b]?

Рейтинг: -4Ответов: 2Опубликовано: 09.03.2023

Например у нас есть матрица :

[
    [1.192, 1.192, 2.255, 0.011, 2.167],
    [1.192, 1.192, 2.255, 0.011, 2.167],
    [2.255, 2.255, 1.734, 0.109, 5.810],
    [0.011, 0.011, 0.109, 0.420, 1.081],
    [2.167, 2.167, 5.810, 1.081, 0.191]
]

Нам нужно получить вектор [x1, x2, x3, x4, x5], где x1 умноженные элементы первой строки, которые принадлежат диапазону [2;10]; x2 умноженные элементы второй строки, которые принадлежат диапазону [2;10]; x3 аналогично.

Если посчитать то в итоге мы должны получить

vector=[4.887, 4.887, 29.544, 0, 27.283]. 
 

Я пытался, но код не работает:

def vectorMatrix ():
    vector=[]
    for i in range (N): 
        for j in range (N):
                if 2<=a[i][j]<=10:
                    vector[i] *= a[i][j]              
                    print (a[i][j], end =' ')
                print()
vectorMatrix ()

Ответы

▲ 0

Можно попробовать вот так:

a = [
    [1.192, 1.192, 2.255, 0.011, 2.167],
    [1.192, 1.192, 2.255, 0.011, 2.167],
    [2.255, 2.255, 1.734, 0.109, 5.810],
    [0.011, 0.011, 0.109, 0.420, 1.081],
    [2.167, 2.167, 5.810, 1.081, 0.191]
]

vector = []
for i in range(len(a)):
    vector.append(0)
    for j in range(len(a[i])):
        if not (2<=a[i][j]<=10):
            a[i][j] = 0
        if a[i][j] != 0:
            if vector[i] == 0 : vector[i] = 1
            vector[i] = round(vector[i] * a[i][j], 3)
  
print(vector)

Вывод:

[4.887, 4.887, 29.544, 0, 27.283]
▲ 0

Более компактный вариант (в одну строку, если убрать переносы строк внутри квадратных скобок):

from math import prod

vector = list()
min_val = 2
max_val = 10
default_val = float(0)
vector = [
    prod(mult_val) if mult_val else default_val for mult_val in
    [
        [a_col for a_col in a_str if min_val <= a_col <= max_val] for a_str in a
    ]
]

Для многоразового использования удобно оформить в виде функции. Внимание!!! Функция заточена на двумерный массив.

from typing import Union
from itertools import chain
from math import prod

def mult_matrix(
    matrix: list[list[float]],
    min_val: Union[float, None] = None,
    max_val: Union[float, None] = None,
    default_val: float = 0.00,
) -> list[float]:
    if max_val is None:
        max_val = max(chain.from_iterable(matrix))
    if min_val is None:
        min_val = min(chain.from_iterable(matrix))
    if min_val > max_val:
        min_val, max_val = max_val, min_val
    return [
        float(prod(mult_val)) if mult_val else default_val
        for mult_val in [[a_col for a_col in a_str if min_val <= a_col <= max_val] for a_str in matrix]
    ]