我正在尝试使用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
这看起来很笨拙,我非常想找到一种更好的方式来编写此代码。
如果有人有想法,我很高兴听到他们的声音。
答案 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]])
有时候,在这样的分配中您可能会遇到广播错误。
但是在任何情况下,您仍然必须创建要分配给数组的对象,并且这样做时很难避免循环-至少在大多数情况下不是这样。