#python #python_3x
Хочу написать "красивое" решение заполнение матрицы 1 или 0 на основе значений другой
матрицы.
Входные данные:
matrix = [[2, 2, 2],
[2, 4, 1],
[2, 6, 0]]
topD = [3, 5, 2]
bottomD = [1, 3, 0]
Результирующая матрица строится таким образом:
Если элемент столбца больше соответствующих bottomD и меньше topD (bottomD < elem
< topD), то в соответствующую ячейку записывается 1. В противном случае записывается 0.
Например, возьмем первый столбец:
1 < 2 < 3
1 < 2 < 3
1 < 2 < 3
Значит первый столбец результирующей матрицы будет:
[1,
1,
1]
Например, возьмем второй столбец:
3 < 2 < 5
3 < 4 < 5
3 < 6 < 5
Значит второй столбец результирующей матрицы будет:
[0,
1,
0]
Сейчас я имею вот такое решение, которое работает, но я хочу "решение в одну строку":
handyStructure = zip(zip(*imgAvg), zip(topD, bottomD))
for column, (big, low) in handyStructure:
tmpRes = list()
for elem in column:
if low < elem < big: tmpRes.append(1)
else: tmpRes.append(0)
b.append(tmpRes)
b = zip(*b)
handyStructure при таких входных данных имеет вид:
[((2, 2, 2), (3.0, 1.0)), ((2, 4, 6), (5.0, 3.0)), ((2, 1, 0), (2.0, 0.0))]
В попытках достич своего "идеала" дошел до вот этого:
res = [list(zip(column, (big, low))) for column, (big, low) in handyStructure]
С помощью этого я хотел достичь того, чтобы каждому элементу матрицы соответствовал
нужная пара topD и bottomD. Но на этом этапе результат уже не верен. После того, как
достич этого, я думал просто дописать что-то вроде:
1 if low < elem < big else 0
Пожалуйста, подскажите.
UPD:
Я достиг того, чего хотел. Вот код:
zip(*[[1 if low < element < big else 0 for element in column] for column, (big, low) in
zip(zip(*imgAvg), zip(topD, bottomD))])
Но он слишком громоздкий. Может есть решение покороче?
Ответы
Ответ 1
Через списковое включение наверное будет понятнее (и короче), чем через zip: new_matrix = [[int(bottomD[i] < el < topD[i]) for i, el in enumerate(xs)] for xs in matrix]Ответ 2
Решение с использованием модуля Numpy: import numpy as np # pip install numpy сначала создадим Numpy матрицы из обычных матриц: m = np.asarray(matrix) top = np.asarray(topD) bottom = np.asarray(bottomD) решение: res = (bottom < m) & (m < top) результат: In [12]: res Out[12]: array([[ True, False, False], [ True, True, True], [ True, False, False]]) или так: In [13]: res.astype('int8') Out[13]: array([[1, 0, 0], [1, 1, 1], [1, 0, 0]], dtype=int8)
Комментариев нет:
Отправить комментарий