【问题标题】:Why do I get error trying to cast np.array(some_list) ValueError: could not broadcast input array为什么我在尝试转换 np.array(some_list) ValueError: could not broadcast input array 时出错
【发布时间】:2015-01-09 05:14:59
【问题描述】:

我正在尝试创建不同形状的 np.array 的 np.array。我需要它,因为在下一部分中,我将总结这个大型 np.array 和一些具有相同形状的 delta_array。 像矩阵求和 self.weights += delta_weights 我也将分别处理其中的每个数组。或者例如,我需要将所有数组元素乘以某个数字。

无法弄清楚出了什么问题:(请帮帮我。 代码创建不同形状的随机 np.arrays 列表。 所以这是我的代码:

weights = []
for i in range(1, len(self.layers)):
    weights.append(np.random.rand(self.layers[i-1] + 1, self.layers[i]))
print(type(weights))
print([(type(w), w.shape) for w in weights])
#error here with layers = [2,2,1] or [3,3,1] etc
self.weights = np.array(weights)

输出: 对于 self.layers=[2, 2, 1]

<class 'list'>
[(<class 'numpy.ndarray'>, (3, 2)), (<class 'numpy.ndarray'>, (3, 1))]
Traceback (most recent call last):
line 20, in <module>
 run()
line 8, in run
 net.init_weights()
line 71, in init_weights
 self.weights = np.array(weights)
ValueError: could not broadcast input array from shape (3,2) into shape (3)

对于 [2, 3, 1] 一切正常:

<class 'list'>
[(<class 'numpy.ndarray'>, (3, 3)), (<class 'numpy.ndarray'>, (4, 1))]

对于 [3, 3, 1] 与 [2, 2, 1] 的故事相同 - 错误

对于 [3, 7, 1] 或 [3, 2, 1] 一切正常。

//这是机器学习梯度下降的权重矩阵。

【问题讨论】:

  • np.hstack 有帮助吗?
  • @Evert 否。它会在 layers=[3, 2, 1] 上失败,即使它有效,我也无法在没有额外代码的情况下迭代数组
  • 我刚刚在 Python3 中使用 1.8.2 numpy 进行了尝试,[2,2,1] 工作正常。
  • 您的numpy 版本是什么?

标签: python arrays python-3.x numpy multidimensional-array


【解决方案1】:

好的,您正在尝试创建一个矩阵数组,以便稍后可以使用数组操作(如+=)。

您可以声明一个ndarray 来保存另一个ndarray,然后用矩阵(简单的二维ndarray)填充它:

weights = np.empty(len(self.layers), dtype=np.ndarray)
for i in range(1, len(self.layers)):
    weights[i] = np.random.rand(self.layers[i-1] + 1, self.layers[i])

请记住,这绝对不是一个三维数组:它纯粹是一个二维数组的数组。

您的代码适用于[2, 3, 1] 的原因是广播了一维为 1 的数组;据我了解,这纯属偶然,不是您想要的。

【讨论】:

    【解决方案2】:

    当您给np.array 一个数组列表时,它会尝试将它们组合成一个数组(具有更高的ndim)。只有当它不能组合它们时,它才会创建一个 dtype object 的数组,每个插槽中有一个数组。

    [2,3,1] 的情况下,两个数组是(3,3)(4,1)。由于无法“堆叠”这些,它会创建一个包含这些 2 的 2 元素数组。

    [3,3,1] 的情况下,两个数组是(4,3)(4,1)。由于维度重叠(4 行),它似乎试图将它们加入一个数组,可能是(2,4,?),但并不十分成功。在您的版本中,它会引发错误,在我的版本中,它会创建一个 (2,4) 无数组。

    Evert 的解决方案是一种通用解决方案,可以正确处理这些令人困惑的情况。即使weights 中的 2 个数组大小相同,它也可以工作。

    例如,如果您的 weights 包含 2 个 (4,3) 数组。 np.arrays(weights) 将产生一个 (2,4,3) 数组。 Evert 的解决方案仍然会生成一个包含 2 个 (4,3) 数组的 (2,) 数组。

    看起来在不同的numpy 版本中存在一个(或两个)错误。带有 1.8.0 numpy 的 Python3 可以很好地处理 [2,2,1] 的情况。

    一个更简单的测试用例是:

    np.array([np.ones((2,2)), np.zeros((2,1))])
    

    玩弄 2 个数组的维度。在大多数情况下,它应该生成一个 2 元素数组,如果 2 维相同,则生成一个 (2,n,m) 数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      相关资源
      最近更新 更多