Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

как увеличить размер numpy матрицы?

#python #numpy


Задача : есть некая матрица размерности - (4,5,3). Мне нужно её расширить до (8,9,3)
, заполнив новое место нулями . Как проще всего это сделать ?
    


Ответы

Ответ 1



Без копирования данных не обойтись, поэтому можно просто создать новый массив нужного размера и записать данные: new = np.zeros((8, 9, 3)) new[:4,:5,:3] = old К примеру, если old = np.arange(60).reshape((4,5,3)), то: >>> new[2] array([[30., 31., 32.], [33., 34., 35.], [36., 37., 38.], [39., 40., 41.], [42., 43., 44.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]) Можно явно скопировать и вызвать resize() метод: new = old.copy() # avoid ValueError: cannot resize this array: it does not own its data new.resize((8, 9, 3)) В отличии от numpy.resize() функции, resize() метод нулями заполняет новые места. Распределение нулей другое (сперва все старые данные идут в Си-порядке в памяти, затем все нули): >>> new[2] array([[54, 55, 56], [57, 58, 59], [ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0]]) Сравнение производительности In [1]: import numpy as np In [2]: old = np.arange(60).reshape((4,5,3)) In [3]: %timeit new = np.concatenate((old, np.zeros_like(old))); new = np.concatenate((new, np.zeros((8, 4, 3))), axis=1) 13.9 µs ± 16.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) In [4]: %timeit new = np.zeros((8,9,3)); new[:4,:5,:3] = old 2.63 µs ± 168 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) In [5]: %timeit new = old.copy(); new.resize((8, 9, 3)) 1.92 µs ± 15.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) resize() самый быстрый здесь.

Ответ 2



Не знаю, можно ли одной командой это сделать, но как вариант расширять по каждой размерности. import numpy as np arr = np.ones((4, 5, 3)) arr = np.concatenate((arr, np.zeros_like(arr))) print(arr.shape) # -> (8, 5, 3) arr = np.concatenate((arr, np.zeros((8, 4, 3))), axis=1) print(arr.shape) # -> (8, 9, 3)

Комментариев нет:

Отправить комментарий