@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 должны появиться новые задаваемые значении и т.д.
  • Вопрос задан
  • 1139 просмотров
Решения вопроса 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
@tumbler Куратор тега Python
бекенд-разработчик на python
  1. Делаем reshape матрицы, вытягивая ее 1x(m*n)
  2. Делаем ее трехмерной: 1x1x(MxN)
  3. Вызываем numpy.pad по первым двум осям (так ведь возможно?)
  4. Делаем обратный reshape, получаем "плитку" MxN из двумерных матриц 3x3.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы