Я спросил о dtype
, потому что ваш пример озадачивает.
я могу сделать структурированный массив с 3-х элементов (1d) и 3-х полей:
In [1]: A = np.ones((3,), dtype='i,i,i')
In [2]: A
Out[2]:
array([(1, 1, 1), (1, 1, 1), (1, 1, 1)],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
я могу получить доступ к одному полю по имени (добавляющие скобки не меняет дела)
In [3]: A['f0'].shape
Out[3]: (3,)
но если я получаю 2 поля, я все равно получаю 1-й массив
In [4]: A[['f0','f1']].shape
Out[4]: (3,)
In [5]: A[['f0','f1']]
Out[5]:
array([(1, 1), (1, 1), (1, 1)],
dtype=[('f0', '<i4'), ('f1', '<i4')])
На самом деле эти дополнительные скобки имеют значение, если я loo K при значениях
In [22]: A['f0']
Out[22]: array([1, 1, 1], dtype=int32)
In [23]: A[['f0']]
Out[23]:
array([(1,), (1,), (1,)],
dtype=[('f0', '<i4')])
Если массив простой 2d один, я до сих пор не получают свои формы
In [24]: A=np.ones((3,3),int)
In [25]: A[0].shape
Out[25]: (3,)
In [26]: A[[0]].shape
Out[26]: (1, 3)
In [27]: A[[0,1]].shape
Out[27]: (2, 3)
Но на вопрос о убедившись, что массив является 2d, независимо от того, индексация возвращает 1d или 2, ваша функция в основном нормально
def reshape_to_vect(ar):
if len(ar.shape) == 1:
return ar.reshape(ar.shape[0],1)
return ar
Вы можете проверить ar.ndim
вместо len(ar.shape)
. Но в любом случае это не дорого - то есть время выполнения минимально - никаких больших операций массива. reshape
не копирует данные (если только ваши шаги не странны), поэтому это просто затраты на создание нового объекта массива с общим указателем данных.
Посмотрите на код для np.atleast_2d
; он тестирует 0d и 1d. В 1-м случае он возвращает result = ary[newaxis,:]
. Он добавляет дополнительную ось сначала, более естественное местоположение для добавления оси. Вы добавляете его в конце.
ar.reshape(ar.shape[0],-1)
- это умный способ обхода теста if
. В небольших временных тестах это происходит быстрее, но мы говорим о микросекундах, о влиянии слоя вызова функции.
np.column_stack
- еще одна функция, которая при необходимости создает столбчатые массивы. Он использует:
if arr.ndim < 2:
arr = array(arr, copy=False, subok=True, ndmin=2).T
Что такое 'dtype'? Выглядит «структурировано». – hpaulj
Это не имеет значения, я просто использовал это как пример того, как я мог бы получить массив 1d или 2d. Мой вопрос о том, как систематически преобразовывать 1d в 2d-массив. – DevShark