Numpy Reshape - автоматическое заполнение или удаление - PullRequest
1 голос
/ 27 сентября 2019

Я хотел бы найти функцию изменения формы, которая способна преобразовывать мои массивы разных измерений в массивы одного измерения.Позвольте мне объяснить это:

import numpy as np
a = np.array([[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,3]]])
b = np.array([[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,4]]])
c = np.array([[[1,2,3,3],[1,2,3,3]]])

Я бы хотел иметь возможность создать b,c фигур, равных a формам.Тем не менее, np.reshape выдает ошибку, потому что, как объяснено здесь ( Изменение размера Numpy или изменение формы Numpy ), функция явно создана для обработки тех же измерений.

Я хотел бы некоторую версию этой функцииэто добавляет нули в начале первого измерения, если форма меньше, или удаляет начало, если форма больше.Мой пример будет выглядеть так:

b = np.array([[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,4]]])
c = np.array([[[0,0,0,0],[0,0,0,0]],[[1,2,3,3],[1,2,3,3]]])

Нужно ли мне писать свою собственную функцию для этого?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Это похоже на приведенное выше решение, но также будет работать, если более низкие размеры не соответствуют

def custom_reshape(a, b):
    result = np.zeros_like(a).ravel()
    result[-min(a.size, b.size):] = b.ravel()[-min(a.size, b.size):]
    return result.reshape(a.shape)

custom_reshape(a,b)
1 голос
/ 27 сентября 2019

Я бы написал такую ​​функцию:

def align(a,b):
    out = np.zeros_like(a)
    x = min(a.shape[0], b.shape[0])
    out[-x:] = b[-x:]

    return out

Вывод:

align(a,b)
# array([[[1, 2, 3, 3],
#         [1, 2, 3, 3]],

#        [[1, 2, 3, 3],
#         [1, 2, 3, 4]]])

align(a,c)
# array([[[0, 0, 0, 0],
#         [0, 0, 0, 0]],

#        [[1, 2, 3, 3],
#         [1, 2, 3, 3]]])
...