【问题标题】:Reshaping numpy arrays of differing dimensions inside an array重塑数组内不同维度的numpy数组
【发布时间】:2020-03-18 15:15:54
【问题描述】:

所以任务是使用 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)

这是一个非常简单的例子,说明 NN 使用的权重列表 - 多维数组列表。如果需要,可以使用 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 的样子,有没有一种既美观又快速的方法。

【问题讨论】:

  • 嗨。您能否提供一个最小的工作示例,以便我们试试运气?也就是说,如果你已经得到的答案不令人满意。
  • @iliar 完成。已添加。

标签: python arrays numpy neural-network particle-swarm


【解决方案1】:
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

【讨论】:

  • 是的!谢谢!它有一个小警告......它无法在您分配 n=s[0]*s[1] 的行处处理一维数组,因为 numpy 给出的形状例如是 [4, ]。因此元组将超出范围。
  • @eddieevt 对其进行了编辑,以便在这些情况下更加稳健。现在它将处理数组的任何维度。
  • 我正要编辑我的评论并说 n = np.prod(s) 可以修复它,但我只能每 5 分钟编辑一次 cmets!哈哈,我学到了一些东西,耶!再次感谢您,好心的先生! :)
【解决方案2】:

您可以将形状保存在变量中(它只是一个元组)。尝试类似:

...
old_shape = arr.shape

# ... do flattening here

new_arr.reshape(old_shape)

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 2022-01-25
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多