@voronin_denis

Как расширить матрицу по значению python?

Имеется матрица долготы, необходимо добавить значения вокруг каждого элемента.
Нашел инструмент numpy.pad, но он добавляет элементы вокруг матрицы. А нужно вокруг каждого значения, расширяя матрицу.


Например матрица [[1,2], [3,4]] должна превратиться в
[[[0.1, 0.2, 0.3],
[0.2, 1, 0.2],
[0.3, 0.2, 0.3], [...][...]

Вокруг 1 должны появиться новые задаваемые значении и т.д.
  • Вопрос задан
  • 123 просмотра
Решения вопроса 2
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Как вариант:
import numpy as np

A = [[1,2], [3,4]]

def pad_el(el): 
    return np.stack( 
        ( 
            np.zeros(3), 
            np.pad([el], 1, mode='constant'), 
            np.zeros(3) 
        ), axis=1)

out_array = []
for i in range(len(A)): 
    row = [] 
    for j in range(len(A[i])):
        if len(row) == 0:
            row = pad_el(A[i][j])
        else:
            row = np.block([row, pad_el(A[i][j])])
    if len(out_array) == 0:
        out_array = row
    else:
        out_array = np.vstack((out_array, row))
print(out_array)

[[0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 2. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 3. 0. 0. 4. 0.]
 [0. 0. 0. 0. 0. 0.]]

Для
A = [[1,2,3], [3,4,5], [6,7,8]]
[[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 2. 0. 0. 3. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 3. 0. 0. 4. 0. 0. 5. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 6. 0. 0. 7. 0. 0. 8. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]]
Ответ написан
adugin
@adugin Куратор тега Python
Вариант №1 - просто вставляем значения исходной матрицы в заданные позиции шаблона:
>>> matrix = np.array([[1, 2], [3, 4]])
>>> new_matrix = np.zeros((6, 6), dtype=matrix.dtype)
>>> new_matrix[1::3, 1::3] = matrix
>>> new_matrix
array([[0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 2, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 3, 0, 0, 4, 0],
       [0, 0, 0, 0, 0, 0]])


Вариант №2 - с полноценными преобразованиями:
>>> matrix = np.array([[1, 2], [3, 4]])
>>> matrix = matrix.reshape(1, 1, -1)
>>> matrix = np.pad(matrix, ((1, 1), (1, 1), (0, 0)), 'constant', constant_values=0)
>>> matrix = matrix.transpose(2, 0, 1).reshape(2, 2, 3, 3)
>>> matrix = np.hstack(np.hstack(matrix))
>>> matrix
array([[0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 2, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 3, 0, 0, 4, 0],
       [0, 0, 0, 0, 0, 0]])

Подозреваю, что можно уменьшить число действий, обойтись без np.stack() и эффективно применить np.lib.stride_tricks.as_strided(), но это лютый мозговынос.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@tumbler
бекенд-разработчик на python
  1. Делаем reshape матрицы, вытягивая ее 1x(m*n)
  2. Делаем ее трехмерной: 1x1x(MxN)
  3. Вызываем numpy.pad по первым двум осям (так ведь возможно?)
  4. Делаем обратный reshape, получаем "плитку" MxN из двумерных матриц 3x3.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Shopster Москва
До 130 000 руб.
АО «НИИМЭ» Зеленоград
от 100 000 до 170 000 руб.
22 нояб. 2019, в 02:42
10000 руб./за проект
22 нояб. 2019, в 01:59
5000 руб./за проект
22 нояб. 2019, в 00:57
500 руб./за проект