Изменение размера и растяжение массива NumPy
Я работаю в Python и у меня есть включает в себя массив такой:
[1,5,9]
[2,7,3]
[8,4,6]
Как растянуть его до чего-то вроде следующего?
[1,1,5,5,9,9]
[1,1,5,5,9,9]
[2,2,7,7,3,3]
[2,2,7,7,3,3]
[8,8,4,4,6,6]
[8,8,4,4,6,6]
это всего лишь некоторые примеры массивов, я фактически буду изменять размеры нескольких массивов, а не только эти.
Я новичок в этом, и я просто не могу понять, что мне нужно делать.
3 ответов
ответ@KennyTM очень скользкий и действительно работает для вашего случая, но в качестве альтернативы, которая может предложить немного больше гибкости для расширения массивов try np.repeat
:
>>> a = np.array([[1, 5, 9],
[2, 7, 3],
[8, 4, 6]])
>>> np.repeat(a,2, axis=1)
array([[1, 1, 5, 5, 9, 9],
[2, 2, 7, 7, 3, 3],
[8, 8, 4, 4, 6, 6]])
Итак, это выполняет повторение вдоль одной оси, чтобы получить его по нескольким осям (как вы могли бы хотеть), просто вложите np.repeat
вызовы:
>>> np.repeat(np.repeat(a,2, axis=0), 2, axis=1)
array([[1, 1, 5, 5, 9, 9],
[1, 1, 5, 5, 9, 9],
[2, 2, 7, 7, 3, 3],
[2, 2, 7, 7, 3, 3],
[8, 8, 4, 4, 6, 6],
[8, 8, 4, 4, 6, 6]])
вы также можете изменить количество повторов для любой начальной строки или столбца. Например, если вы хотите два повтора каждой строки, кроме последний ряд:
>>> np.repeat(a, [2,2,1], axis=0)
array([[1, 5, 9],
[1, 5, 9],
[2, 7, 3],
[2, 7, 3],
[8, 4, 6]])
здесь, когда второй аргумент является list
он указывает строку (строки в этом случае, потому что axis=0
) повторяется для каждой строки.
>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]])
>>> numpy.kron(a, [[1,1],[1,1]])
array([[1, 1, 5, 5, 9, 9],
[1, 1, 5, 5, 9, 9],
[2, 2, 7, 7, 3, 3],
[2, 2, 7, 7, 3, 3],
[8, 8, 4, 4, 6, 6],
[8, 8, 4, 4, 6, 6]])
к сожалению, numpy не допускает дробных шагов (насколько мне известно). Вот обходной путь. Это не так умно, как решение Кенни, но он использует традиционное индексирование:
>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]])
>>> step = .5
>>> xstop, ystop = a.shape
>>> x = numpy.arange(0,xstop,step).astype(int)
>>> y = numpy.arange(0,ystop,step).astype(int)
>>> mg = numpy.meshgrid(x,y)
>>> b = a[mg].T
>>> b
array([[1, 1, 5, 5, 9, 9],
[1, 1, 5, 5, 9, 9],
[2, 2, 7, 7, 3, 3],
[2, 2, 7, 7, 3, 3],
[8, 8, 4, 4, 6, 6],
[8, 8, 4, 4, 6, 6]])
(решение dtlussier лучше)