2015-02-16 8 views
5

Мне нужно, чтобы hstacking multple массивы с одинаковым количеством строк (хотя количество строк является переменной между использованиями), но разное количество столбцов. Однако некоторые из массивов имеют только один столбец, например.Numpy: получить массив 1D как 2D-массив без изменения

array = np.array([1,2,3,4,5]) 

который дает

#array.shape = (5,) 

, но я хотел бы иметь форму признанную в качестве 2-го массива, например.

#array.shape = (5,1) 

Чтобы hstack мог их комбинировать. Мое текущее решение:

array = np.atleast_2d([1,2,3,4,5]).T 
#array.shape = (5,1) 

Так мне было интересно, есть ли лучший способ сделать это? Будет ли

array = np.array([1,2,3,4,5]).reshape(len([1,2,3,4,5]), 1) 

быть лучше? Обратите внимание, что мое использование [1,2,3,4,5] - это только список игрушек, чтобы сделать пример конкретным. На практике это будет гораздо больший список, переданный в функцию в качестве аргумента. Благодаря!

ответ

5

проверьте код hstack и vstack. Один или оба из них передают аргументы через atleast_nd. Это вполне приемлемый способ изменения массива.

Некоторые другие способы:

arr = np.array([1,2,3,4,5]).reshape(-1,1) # saves the use of len() 
arr = np.array([1,2,3,4,5])[:,None] # adds a new dim at end 
np.array([1,2,3],ndmin=2).T # used by column_stack 

hstack и vstack трансформируют свои входы с:

arrs = [atleast_1d(_m) for _m in tup] 
[atleast_2d(_m) for _m in tup] 

тестовых данных:

a1=np.arange(2) 
a2=np.arange(10).reshape(2,5) 
a3=np.arange(8).reshape(2,4) 

np.hstack([a1.reshape(-1,1),a2,a3]) 
np.hstack([a1[:,None],a2,a3]) 
np.column_stack([a1,a2,a3]) 

результат:

array([[0, 0, 1, 2, 3, 4, 0, 1, 2, 3], 
     [1, 5, 6, 7, 8, 9, 4, 5, 6, 7]]) 

Если вы не знаете заранее, которые массивы 1d, то column_stack является самым простым в использовании. Остальным требуется небольшая функция, которая проверяет размерность перед применением перестройки.

Numpy: use reshape or newaxis to add dimensions

+0

Интересно, я не знал об этих двух способах. Я попробую те, у кого есть некоторые тесты времени, чтобы увидеть, что лучше всего работает, но оба кажутся менее изобретенными, чем мой метод. Благодаря! – Taaam

+0

Я добавил ссылку на недавний связанный вопрос SO. – hpaulj

+0

В последней версии добавлен более общий «стек». – hpaulj

1

Если я правильно понял ваши намерения правильно, вы хотите, чтобы преобразовать массив формы (N,) в массив формы (N, 1), так что вы можете применить np.hstack:

In [147]: np.hstack([np.atleast_2d([1,2,3,4,5]).T, np.atleast_2d([1,2,3,4,5]).T]) 
Out[147]: 
array([[1, 1], 
     [2, 2], 
     [3, 3], 
     [4, 4], 
     [5, 5]]) 

В этом случае , вы могли бы использовать, избегают перестроек массивов и использовать np.column_stack вместо:

In [151]: np.column_stack([[1,2,3,4,5], [1,2,3,4,5]]) 
Out[151]: 
array([[1, 1], 
     [2, 2], 
     [3, 3], 
     [4, 4], 
     [5, 5]]) 
+0

Спасибо, я на самом деле использовать это с scikit-узнать так и они используют hstack внутри, так что я в них нуждается быть ориентированным на ряд. – Taaam

0

Просто, чтобы добавить информацию о ответе hpaulj в. Мне было любопытно, как быстро описывались четыре метода. Победителем является метод добавления столбца в конце массива 1d.

Вот что я побежал:

import numpy as np 
import timeit 

v = [1,2,3,4,5] 

print('atleast2d:',timeit.timeit(lambda:np.atleast_2d(v).T)) 
print('reshape:',timeit.timeit(lambda:np.array(v).reshape(-1,1))) # saves the use of len() 
print('v[:,None]:', timeit.timeit(lambda:np.array(v)[:,None])) # adds a new dim at end 
print('np.array(v,ndmin=2).T:', timeit.timeit(lambda:np.array(v,ndmin=2).T)) # used by column_stack 

И результаты:

atleast2d: 4.455070924214851 
reshape: 2.0535152913971615 
v[:,None]: 1.8387219828073285 
np.array(v,ndmin=2).T: 3.1735243063353664 
Смежные вопросы