【问题标题】:Why can't I produce a Numpy Array from my list? Indexing Error为什么我不能从我的列表中生成一个 Numpy 数组?索引错误
【发布时间】:2022-01-25 03:18:47
【问题描述】:

尝试按照 Scipy documentation 将 linear_sum_assignment 函数应用于我的代码,其中我试图为每个披萨分配 1 个机器人,以便机器人的总行程时间尽可能短。

Robots 是 6 个机器人对象的列表,我故意忽略其中的第一个机器人。 SwapTargets 是 5 个 Pizza 对象的列表

newlist = []
for j in range(1,len(Robots)):
  for i in range(0,len(SwapTargets)):
    ref_x = SwapTargets[i].coordinates[0]
    ref_y = SwapTargets[i].coordinates[1]
    value = ((ref_x - Robots[j].x)**2) + (ref_y - Robots[j].y)**2
    newlist.append(value)
  
myarray = np.array(newlist).reshape(len(Robots[1:]),len(SwapTargets))  

from scipy.optimize import linear_sum_assignment

row_ind, col_ind = linear_sum_assignment(myarray)

PizzaList = np.array([SwapTargets])[row_ind]
RobotList = np.array([Robots[1:]])[col_ind]
result = dict(zip(PizzaList, RobotList))
print(result)

PizzaList = np.array([SwapTargets])[row_ind] 我收到一个错误IndexError: index 1 is out of bounds for axis 0 with size 1

作为一个测试,如果我在PizzaList = np.array([SwapTargets])[row_ind] 中将[SwapTargets] 替换为["A,"B","C","D","E"],则不会出现错误,但不明白为什么我的5 个对象列表不起作用。

感谢python noobie

【问题讨论】:

    标签: python arrays numpy scipy


    【解决方案1】:

    您几乎是在回答自己的问题。您声明 SwapTargets 是 5 个 Pizza 对象的列表。这意味着它可以像这样初始化:

    SwapTargets = [pizza0, pizza1, pizza2, pizza3, pizza4, pizza5]
    

    那你在执行时说:

    PizzaList = np.array(["A", "B", "C", "D", "E"])[row_ind]
    

    工作,执行

    PizzaList = np.array([SwapTargets])[row_ind]
    

    没有。要了解发生了什么,只需将 SwapTargets 的初始化替换为标识符,以上变为:

    PizzaList = np.array([[pizza0, pizza1, pizza2, pizza3, pizza4, pizza5]])[row_ind]
    

    看到双嵌套括号了吗?

    这里发生的情况是,您在一个只有一个项目的列表上调用np.array()(该项目本身是一个包含 5 个项目的列表)。在成功的调用中,您调用了一个包含 5 个项目的列表的相同函数,这可能是您想要的。

    你想写的其实是:

    PizzaList = np.array(SwapTargets)[row_ind]
    

    (参数周围没有括号)。

    【讨论】:

      【解决方案2】:

      考虑以下之间的区别:

      >>> numpy.array([1,2,3])
      array([1, 2, 3])
      

      >>> numpy.array([[1,2,3]])
      array([[1, 2, 3]])
      

      第一个是长度为3 的向量,第二个是维度为(1, 3) 的矩阵。您可以通过检查两者的shape 来查看:

      >>> numpy.array([1,2,3]).shape
      (3,)
      >>> numpy.array([[1,2,3]]).shape
      (1, 3)
      

      np.array([SwapTargets]) 与上面的第二个示例相同。它的第一维长度为1,因此索引在第一维中的0 处结束。你可能想要np.array(SwapTargets)

      【讨论】:

        猜你喜欢
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        相关资源
        最近更新 更多