Numpy append: автоматически преобразовать массив неправильное измерение

есть ли способ сделать следующее без предложения if?

Я читаю набор файлов netcdf с помощью pupynere и хочу построить массив с помощью numpy добавить. Иногда входные данные являются многомерными (см. переменную «a» ниже), иногда одномерными («b»), но количество элементов в первом измерении всегда одинаково («9» в примере ниже). .

> import numpy as np
> a = np.arange(27).reshape(3,9)
> b = np.arange(9)
> a.shape
(3, 9)
> b.shape
(9,)

это работает как ожидалось:

> np.append(a,a, axis=0)
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8],
   [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
   [18, 19, 20, 21, 22, 23, 24, 25, 26],
   [ 0,  1,  2,  3,  4,  5,  6,  7,  8],
   [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
   [18, 19, 20, 21, 22, 23, 24, 25, 26]])

но, добавление b работает не так элегантно:

> np.append(a,b, axis=0)
ValueError: arrays must have same number of dimensions

Проблема с append (из руководства по numpy)

«Когда указана ось, значения должны иметь правильную форму».

Мне пришлось бы сначала выполнить приведение в чтобы получить правильный результат.

> np.append(a,b.reshape(1,9), axis=0)
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8],
   [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
   [18, 19, 20, 21, 22, 23, 24, 25, 26],
   [ 0,  1,  2,  3,  4,  5,  6,  7,  8]])

Итак, в моем цикле чтения файла я в настоящее время использую предложение if, подобное этому:

for i in [a, b]:
    if np.size(i.shape) == 2:
        result = np.append(result, i, axis=0)
    else:
        result = np.append(result, i.reshape(1,9), axis=0)

Есть ли способ добавить «a» и «b» без оператора if?

РЕДАКТИРОВАТЬ: Хотя @Sven отлично ответил на исходный вопрос (используя np.atleast_2d () ), он (и другие) указал, что код неэффективен. В ответе ниже я объединил их предложения и заменил свой исходный код. Теперь это должно быть намного эффективнее. Спасибо.

5
задан Sebastian 22 April 2011 в 07:07
поделиться