2016-03-04 4 views
0

У меня есть функция (MyFunct(X)), что, в зависимости от значения X, вернет либо 3D-Numpy массив (например, np.ones((5,2,3)) или пустой массив (np.array([])).построить постоянно растущий 3D массив Numpy

RetVal = MyFunct(X) # RetVal can be np.array([]) or np.ones((5,2,3)) 

NB Я использую np.ones((5,2,3)) как способ генерировать поддельные данные - в действительности содержание RetVal является все целые

MyFunct вызывается с диапазоном differe. nt X, некоторые из которых приведут к возврату пустого массива, а другие - нет.

Я хотел бы создать новый 3D массив Numpy (OUT), который является n по 2 по 3 каскадного массив всех возвращаемых значений из MyFunct(). Эта проблема пытается объединить трехмерный массив, а пустой список вызывает исключение (понятно!), А не просто молча. Существуют различные способы обойти это:

  • Явной проверка, если RetVal пуст или нет, а затем использовать np.concatenate()
  • Использование Try/за исключением блока и перехват исключений
  • Добавление каждого значения в список, а затем пост -обработка путем удаления пустых записей

Но все это кажется уродливым. Есть ли эффективный/быстрый способ сделать это «правильно»?

+3

Растущих массивов по конкатенации очень дорого, так как каждый конкатенация операции сил генерировать новую копию всего массива , Это становится медленнее и медленнее, так как ваш массив растет все больше и больше. В общем, лучше либо 1) выделить массив больше, чем вы считаете нужным, и заполнить строки по ходу дела, либо 2) собрать подмассивы в списке и выполнить все конкатенации за один шаг. –

+0

'np.zeros ((0,2,3))' столь же пуст, как и 'np.array ([])', и более совместим с массивами '(n, 2,3)'. – hpaulj

+0

Спасибо - список добавления, за которым следует конкатенация, внес огромный вклад в производительность (что, очевидно, должно быть!) – Alex

ответ

1

Вы можете изменить массивы в совместимую форму:

concatenate([MyFunct(X).reshape((-1,2,3)) for X in values]) 

Пример:

In [2]: def MyFunc(X): return ones((5,2,3)) if X%2 else array([]) 

In [3]: concatenate([MyFunc(X).reshape((-1,2,3)) for X in range(6)]).shape 
Out[3]: (15, 2, 3) 
Смежные вопросы