2016-03-04 73 views
0

我有一个函数(MyFunct(X)),取决于的X值,将返回要么三维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被称为有各色范围的。 nt X值,其中一些会导致返回一个空数组,而另一些则不会。

我想创建一个新的3D numpy阵列(OUT)这是一个n由所有返回值从MyFunct()的2 3连接数组。这个问题试图连接一个3D数组,而一个空列表导致一个异常(可以理解!),而不是默默无闻地做任何事情。有多种方法解决此问题:

  • 明确检查是否RetVal为空,然后使用np.concatenate()
  • 使用try/except块和捕获异常
  • 每个值添加到列表,然后交通过删除空条目来处理

但是,这些都让人觉得难看。有没有一种有效/快速的方法来“正确”做到这一点?

+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)