重塑数组内不同维度的numpy数组
Reshaping numpy arrays of differing dimensions inside an array
因此任务是使用 PSO 优化神经网络。 PSO 需要所有权重和偏差的一维列表,例如 [0.1 0.244 ... 0.214]。 NN 需要一个具有不同维度的数组,例如 [[x,y], [m,n], ...(所有隐藏层矩阵)...,[p,q]] X 和 y 是输入层的维度,然后是所有隐藏层,最后是 p 和 q - 输出层的维度。
我可以轻松地展平数组以将其传递给 PSO,但我需要一种方法来获取修改后的数组并将其重新整形为与 NN 中的起始数组具有相同维度的同一数组数组。
维度取决于一层中神经元的数量,我们从一开始就有这些信息。
我试图跟踪形状数组并创建一个索引数组来知道何时停止,但它似乎不起作用。我现在正在尝试切片,但还没有雪茄。也可以对 NN 进行修改,但如何创建它以使其采用预定义的权重列表?可能有一个非常好的和有效的方法来做到这一点,但我还没有想到它...有什么建议吗?
示例:
a = np.array([1,2,3])
b = np.array([7,8,9,10])
c = np.array([12,13,14,15,16])
b.reshape(2,2)
arr = []
arr.append(a)
arr.append(b)
arr.append(c)
这是一个非常简单的示例,说明了神经网络使用权重列表时的含义 - 多维数组列表。如有必要,可以使用 np.asarray(arr) 将 Arr 转换为对象的 numpy 数组。
展平很容易,我是这样做的(可能有更好的不需要循环的,如果你知道,如果你分享,我将不胜感激)。
扁平化:
new_arr = np.array([])
for i in range(len(arr)):
new_arr = np.append(arr, arr[i].flatten())
我的问题是如何将 new_arr 放回原处以看起来像 arr,是否有一种漂亮而快速的方法来做到这一点。
您可以将形状保存在变量中(它只是一个元组)。尝试类似的东西:
...
old_shape = arr.shape
# ... do flattening here
new_arr.reshape(old_shape)
new_arr = np.array([])
shapes=[]
for i in range(len(arr)):
new_arr = np.append(new_arr, arr[i].flatten())
shapes.append(arr[i].shape)
#do whatever
restoredArray =[]
offset=0
for i in range(len(shapes)):
s = shapes[i]
n = np.prod(s)
restoredArray.append(new_arr[offset:(offset+n)].reshape(s))
offset+=n
因此任务是使用 PSO 优化神经网络。 PSO 需要所有权重和偏差的一维列表,例如 [0.1 0.244 ... 0.214]。 NN 需要一个具有不同维度的数组,例如 [[x,y], [m,n], ...(所有隐藏层矩阵)...,[p,q]] X 和 y 是输入层的维度,然后是所有隐藏层,最后是 p 和 q - 输出层的维度。
我可以轻松地展平数组以将其传递给 PSO,但我需要一种方法来获取修改后的数组并将其重新整形为与 NN 中的起始数组具有相同维度的同一数组数组。
维度取决于一层中神经元的数量,我们从一开始就有这些信息。
我试图跟踪形状数组并创建一个索引数组来知道何时停止,但它似乎不起作用。我现在正在尝试切片,但还没有雪茄。也可以对 NN 进行修改,但如何创建它以使其采用预定义的权重列表?可能有一个非常好的和有效的方法来做到这一点,但我还没有想到它...有什么建议吗?
示例:
a = np.array([1,2,3])
b = np.array([7,8,9,10])
c = np.array([12,13,14,15,16])
b.reshape(2,2)
arr = []
arr.append(a)
arr.append(b)
arr.append(c)
这是一个非常简单的示例,说明了神经网络使用权重列表时的含义 - 多维数组列表。如有必要,可以使用 np.asarray(arr) 将 Arr 转换为对象的 numpy 数组。
展平很容易,我是这样做的(可能有更好的不需要循环的,如果你知道,如果你分享,我将不胜感激)。
扁平化:
new_arr = np.array([])
for i in range(len(arr)):
new_arr = np.append(arr, arr[i].flatten())
我的问题是如何将 new_arr 放回原处以看起来像 arr,是否有一种漂亮而快速的方法来做到这一点。
您可以将形状保存在变量中(它只是一个元组)。尝试类似的东西:
...
old_shape = arr.shape
# ... do flattening here
new_arr.reshape(old_shape)
new_arr = np.array([])
shapes=[]
for i in range(len(arr)):
new_arr = np.append(new_arr, arr[i].flatten())
shapes.append(arr[i].shape)
#do whatever
restoredArray =[]
offset=0
for i in range(len(shapes)):
s = shapes[i]
n = np.prod(s)
restoredArray.append(new_arr[offset:(offset+n)].reshape(s))
offset+=n