У меня есть функция (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/за исключением блока и перехват исключений
- Добавление каждого значения в список, а затем пост -обработка путем удаления пустых записей
Но все это кажется уродливым. Есть ли эффективный/быстрый способ сделать это «правильно»?
Растущих массивов по конкатенации очень дорого, так как каждый конкатенация операции сил генерировать новую копию всего массива , Это становится медленнее и медленнее, так как ваш массив растет все больше и больше. В общем, лучше либо 1) выделить массив больше, чем вы считаете нужным, и заполнить строки по ходу дела, либо 2) собрать подмассивы в списке и выполнить все конкатенации за один шаг. –
'np.zeros ((0,2,3))' столь же пуст, как и 'np.array ([])', и более совместим с массивами '(n, 2,3)'. – hpaulj
Спасибо - список добавления, за которым следует конкатенация, внес огромный вклад в производительность (что, очевидно, должно быть!) – Alex