Изменение размера и растяжение массива NumPy - PullRequest
25 голосов
/ 19 ноября 2010

Я работаю в Python, и у меня есть массив NumPy , подобный этому:

[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 ]

27 голосов
/ 19 ноября 2010

@ Ответ KennyTM очень приятный и действительно работает для вашего случая, но в качестве альтернативы, который может предложить немного большую гибкость для расширения массивов, попробуйте 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) повторяется для каждого ряда.

12 голосов
/ 19 ноября 2010
>>> 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]])
1 голос
/ 19 ноября 2010

К сожалению, 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 лучше)

...