Python 创建具有任意形状的Numpy数组(最好不包含for循环)

Python 创建具有任意形状的Numpy数组(最好不包含for循环),python,numpy,shapes,Python,Numpy,Shapes,我试图用numpy映射我的神经网络的拓扑结构 我正在寻找一种方法来创建一个不规则形状的数组,最好不使用for循环 下面的代码创建一个numpy对象数组。数组是不规则形状,将根据传入的Iarray变量进行更改 我的神经网络的拓扑结构是[2,3,2],所以这个函数输出一个三列数组,第一列2个元素,第二列3个元素,第三列2个元素 def object_array(Iarray): Array = np.empty([1,len(Iarray)],"object") Cell_Ch

我试图用numpy映射我的神经网络的拓扑结构


我正在寻找一种方法来创建一个不规则形状的数组,最好不使用for循环

下面的代码创建一个numpy对象数组。数组是不规则形状,将根据传入的Iarray变量进行更改

我的神经网络的拓扑结构是[2,3,2],所以这个函数输出一个三列数组,第一列2个元素,第二列3个元素,第三列2个元素

 def object_array(Iarray):
     Array = np.empty([1,len(Iarray)],"object")
     Cell_Chain = np.empty()
     for i in range(len(Iarray)):   
         row = np.array([LSTM.Cell(i,ii) for ii in range(Iarray[i])])    
         Array[0,i] = row
     return Array 
这看起来很笨重,我非常想找到一种更好的方法来编写这段代码


如果有人有想法,我很高兴听到他们的想法。

创建对象数据类型数组很容易:

In [550]: arr = np.empty(5, object)                                                                    
In [551]: arr                                                                                          
Out[551]: array([None, None, None, None, None], dtype=object)
您可以从对象列表中填充它:

In [552]: arr[:] = [np.arange(i) for i in range(5)]                                                    
In [553]: arr                                                                                          
Out[553]: 
array([array([], dtype=int64), array([0]), array([0, 1]),
       array([0, 1, 2]), array([0, 1, 2, 3])], dtype=object)
实际上,您可以直接从列表中创建阵列:

In [554]: np.array([np.arange(i) for i in range(5)])                                                   
Out[554]: 
array([array([], dtype=int64), array([0]), array([0, 1]),
       array([0, 1, 2]), array([0, 1, 2, 3])], dtype=object)

In [555]: np.array([np.arange(3) for i in range(5)])                                                   
Out[555]: 
array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]])
预定义阵列的分配更可靠:

In [561]: arr[:]=[np.arange(3) for i in range(5)]                                                      
In [562]: arr                                                                                          
Out[562]: 
array([array([0, 1, 2]), array([0, 1, 2]), array([0, 1, 2]),
       array([0, 1, 2]), array([0, 1, 2])], dtype=object)
在这样的作业中,有时会出现广播错误


但是在任何情况下,您仍然必须创建要分配给数组的对象,并且在这样做时很难避免循环——至少在最一般的情况下不是这样

我正在寻找一种方法来创建一个不规则形状的数组-那么NumPy可能是一个糟糕的工具选择。为什么不使用列表列表呢?您希望通过使用NumPy获得什么好处?无论您希望得到什么好处,您都可能得不到。np.empty会产生一个错误。你想做什么?一个形状不规则的数组,或者更确切地说是一个包含不同形状数组的对象数据类型数组,是一个笨重的对象,所以创建它也会很笨重。就像处理它一样!据我所知,我能够控制numpy中的数据类型以减少内存,我也知道普通python列表存储指针,而不是实际值。我需要这是尽可能有效的。我不使用规则形状阵列的原因是,在我的成品中,我将有800多个输入,几乎没有那么多隐藏的神经元。因此,我认为运行800x16阵列需要花费很多时间。您尝试创建的阵列不会带来任何好处。NumPy的内存优势仅适用于本机数据类型和常规的网格结构阵列。对于形状不规则的LSTM单元对象集合,列表列表的效果要好得多。