创建一个具有任意形状的Numpy数组(最好没有for循环)

时间:2019-06-09 23:07:45

标签: 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_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 

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

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

1 个答案:

答案 0 :(得分:1)

创建对象dtype数组很容易:

import { Component, OnInit } from '@angular/core';

import { CategoryService } from './../core/service/category.service';

@Component({
  selector: 'app-footer',
  templateUrl: './footer.component.html',
  styleUrls: ['./footer.component.css']
})
export class FooterComponent implements OnInit {

  categories = [];

  constructor(
    private categoryService: CategoryService
  ) { }

  ngOnInit() {
    this.getAllCategories();
  }

  getAllCategories() {
    return this.categoryService.getAll()
      .then(categories => {
        this.categories = categories;
      })
      .catch(error => {
        throw error;
      });
  }

}

您可以从对象列表中填充它:

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

有时候,在这样的分配中您可能会遇到广播错误。

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