【问题标题】:How to iterate using numpy instead of a for loop如何使用 numpy 而不是 for 循环进行迭代
【发布时间】:2021-02-24 20:33:24
【问题描述】:

在以下代码中:

import numpy as np

a = np.array([1,3,5,7,9,11,13,15,17,19])
b = np.array([2,4,6,8,10,12,14,16,18,20])

c=0
for n in range(4,6):
    c+= a[9-n]*b[n]
print(c)

您可以使用 for 循环轻松计算 c。如果我执行以下操作而不是 for 循环:

d =0
d+= np.dot(a[5:3],b[4:6])
print(d)

我收到错误消息:

形状 (0,) 和 (2,) 未对齐:0 (dim 0) != 2 (dim 0)

如何修改代码来纠正这个问题?

【问题讨论】:

  • np.dot(a[5:3:-1],b[4:6])

标签: python arrays numpy for-loop


【解决方案1】:
d+= np.dot(a[5:3],b[4:6])

查看切片的详细信息。 a[5:3] 是一个空切片,因此它与点积所需的长度不匹配。您需要指定步长 -1。

【讨论】:

    【解决方案2】:

    dot 错误告诉我们您的切片错误。一个产生 0 个值,另一个产生 2 个值。dot 需要匹配大小。

    In [3]: a = np.array([1,3,5,7,9,11,13,15,17,19])
       ...: b = np.array([2,4,6,8,10,12,14,16,18,20])
       ...: 
    

    看看你的循环索引使用什么值:

    In [4]: for n in range(4,6):
       ...:     print(a[9-n], b[n])
       ...: 
    11 10
    9 12
    

    让我们尝试复制它们。

    In [5]: idx = np.arange(4,6)
    In [6]: idx
    Out[6]: array([4, 5])
    In [7]: a[9-idx], b[idx]
    Out[7]: (array([11,  9]), array([10, 12]))
    

    或者使用切片(用-1步向后一步):

    In [8]: a[9-4:9-6:-1]
    Out[8]: array([11,  9])
    In [9]: b[4:6]
    Out[9]: array([10, 12])
    

    现在您可以使用 dot 中的 2 个切片。

    【讨论】:

      【解决方案3】:

      我的朋友。据我在错误输出中看到的,它强调两个 NumPy 数组的大小不相等,因为您指定为 a[5:3] 的表达式是一个空切片。要解决此问题,您应该执行以下操作。

      d =np.dot(a[4:6],b[4:6])
      

      如果你认为我误解了你,请警告我。

      【讨论】:

      • 这并不能解决给定的问题。再次查看发布代码中的索引。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2020-07-30
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2018-07-05
      相关资源
      最近更新 更多