2013-07-10 4 views
6

Каков самый простой способ расширить данный массив NumPy над дополнительным размером?Расширение массива NumPy над дополнительным размером

Например, предположим, что у меня есть

>>> np.arange(4) 
array([0, 1, 2, 3]) 
>>> _.shape 
(4,) 
>>> expand(np.arange(4), 0, 6) 
array([[0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3]]) 
>>> _.shape 
(6, 4) 

или этот, немного более сложное:

>>> np.eye(2) 
array([[ 1., 0.], 
     [ 0., 1.]]) 
>>> _.shape 
(2, 2) 
>>> expand(np.eye(2), 0, 3) 
array([[[ 1., 0.], 
     [ 0., 1.]], 

     [[ 1., 0.], 
     [ 0., 1.]], 

     [[ 1., 0.], 
     [ 0., 1.]]]) 
>>> _.shape 
(3, 2, 2) 
+0

Вы пробовали панды? – fabrizioM

+0

Нет, я этого не делал, вероятно, был бы излишним для того, чего хочу. – astrojuanlu

ответ

5

Я бы порекомендовал np.tile.

>>> a=np.arange(4) 
>>> a 
array([0, 1, 2, 3]) 
>>> np.tile(a,(6,1)) 
array([[0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3]]) 

>>> b= np.eye(2) 
>>> b 
array([[ 1., 0.], 
     [ 0., 1.]]) 
>>> np.tile(b,(3,1,1)) 
array([[[ 1., 0.], 
     [ 0., 1.]], 

     [[ 1., 0.], 
     [ 0., 1.]], 

     [[ 1., 0.], 
     [ 0., 1.]]]) 

Расширение во многих измерениях довольно легко также:

>>> np.tile(b,(2,2,2)) 
array([[[ 1., 0., 1., 0.], 
     [ 0., 1., 0., 1.], 
     [ 1., 0., 1., 0.], 
     [ 0., 1., 0., 1.]], 

     [[ 1., 0., 1., 0.], 
     [ 0., 1., 0., 1.], 
     [ 1., 0., 1., 0.], 
     [ 0., 1., 0., 1.]]]) 
+0

«Построить массив, повторив A количество раз, заданное повторениями». Да, точно, спасибо! – astrojuanlu

+0

Если я правильно понимаю, это создает новый массив, который бесполезно занимает много памяти, в то время как простой * вид * существующего массива будет достаточным ... – Alexey

1

Я думаю, модифицируя шаги массива позволяет легко писать expand:

def expand(arr, axis, length): 
    new_shape = list(arr.shape) 
    new_shape.insert(axis, length) 
    new_strides = list(arr.strides) 
    new_strides.insert(axis, 0) 
    return np.lib.stride_tricks.as_strided(arr, new_shape, new_strides) 

Функция возвращает представление исходного массива, который не требует дополнительной памяти.

stride, соответствующий новой оси, равно 0, так что независимо от того, что индекс для этой оси остается неизменным, в основном дает вам желаемое поведение.