@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 должны появиться новые задаваемые значении и т.д.
  • Вопрос задан
  • 294 просмотра
Решения вопроса 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.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы