首页 > 解决方案 > 创建一个任意形状的 Numpy 数组,(最好没有 for 循环)

问题描述

我正在尝试使用 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 

这看起来很笨拙,我非常想找到一种更好的方法来编写这段代码。

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

标签: pythonnumpyshapes

解决方案


创建对象 dtype 数组很容易:

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)

有时,您可能会在此类作业中出现广播错误。

但无论如何,您仍然必须创建要分配给数组的对象,并且在这样做时很难避免循环 - 至少在大多数情况下不会。


推荐阅读