【问题标题】:How to broadcast a list in Python?如何在 Python 中广播列表?
【发布时间】:2021-10-20 12:18:38
【问题描述】:

我需要将 Python 中的列表广播到更大的值。我实际上正在研究一种不使用 Numpy 的反向传播算法。在我有限的开发环境中,我也无权访问它。

据我了解,当您在两个数组上使用 Numpy.dot() 操作时,如果一个数组小于另一个数组,numpy 将广播一个数组,因此它们的大小相等。

   dW = np.dot(dZ, A_prev.T) / m 

当两者不可整除时,Numpy 如何处理广播数组?也就是当两个数组的模不等于0的时候?

就我而言,我有两个列表; len(dZ) 也等于 512,len(A_prev) 也等于 741。我应该如何处理广播 dZ 使其与 A_prev 的大小相同?

到目前为止我尝试过的是:

dZ = dZ * (len(dZ) + (len(A_prev) % len(dZ)))

然而,dZ 是一个巨大的数字,大约 16,000。我不知道为什么。

【问题讨论】:

  • IIRC np.dot 不广播,你必须自己提供合适的形状。
  • 只是出于好奇,你的开发环境是什么,不允许使用numpy?
  • 我不明白你想如何将 2 个不同长度的向量相乘?您能提供示例输入和输出吗?

标签: python numpy backpropagation


【解决方案1】:

你可以试试这些:

假设 dz 是一个长度为 3 的数组:

dz = [4,2,8]

而 A_prev 是 11 项数组:

A_prev  = [0]*11

比将 dz 广播到 A_prev 的长度,这样做:

dz = dz* (len(A_prev)//len(dz)) 
dz = dz + dz[:len(A_prev)-len(dz)] 

现在 dz 是一个 11 项数组:

[4, 2, 8, 4, 2, 8, 4, 2, 8, 4, 2]

【讨论】:

    【解决方案2】:

    我认为您应该手动执行此操作并创建一个具有正确尺寸的新数组。毕竟,Python 的格言是显式总比隐式好。 https://www.python.org/dev/peps/pep-0020/ Numpy 使用 C 后端并且有许多优化表达式的技巧,因此您可以忽略很多技术细节。 此外,为不同类型的数据重用变量名是令人困惑和不好的做法。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    也许你喜欢在没有numpy 的情况下执行此操作,并使用itertools.cycle 执行此操作,如下所示:

    >>> from itertools import cycle
    
    >>> dz = [4,2,8]
    >>> itr = cycle(dz)
    >>> [next(itr) for _ in range(11)] 
    [4, 2, 8, 4, 2, 8, 4, 2, 8, 4, 2]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2021-01-11
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      相关资源
      最近更新 更多