【问题标题】:ValueError: operands could not be broadcast together with shapes (3,) (100,)ValueError: 操作数不能与形状 (3,) (100,) 一起广播
【发布时间】:2019-08-21 20:17:24
【问题描述】:

我有这个任务需要解决:

界面

def roundGrade(grades):
    # Insert your code here
    return gradesRounded

输入参数

grades:一个向量(每个元素是一个介于 -3 和 12 之间的数字)。

返回值

gradesRounded:一个向量(每个元素都是一个 7 步长的数字)。

说明

该函数必须对向量等级中的每个元素进行四舍五入,并返回 7 步尺度上最接近的等级:

7-step-scale: Grades 12 10 7 4 02 00 −3

例如,如果函数将向量 [8.2, -0.5] 作为输入,它必须返回四舍五入的等级 [7, 0],这是评分等级上最接近的数字。

我已经尝试了以下代码:

import numpy as np

def roundGrade(grades):
    trueGrades = np.array([12, 10, 7, 4, 2, 0, -3])
    matrix = np.array([trueGrades, (len(grades)), 1])
    index = np.argmin(np.abs(matrix.T - grades), axis=0)
    gradesRounded = trueGrades[index]

    return gradesRounded

当我逐行运行代码时,出现以下错误:

index = np.argmin(np.abs(matrix.T - grades), axis=0)

ValueError: operands could not be broadcast together with shapes (3,) (100,) 

我该如何解决这个问题?

【问题讨论】:

  • 尝试打印出matrixgrades 的形状...
  • 那是因为matrix内部函数定义的形状是3行1列。并且传递给函数的grades 是100,它们应该具有相同的大小以进行算术运算,例如matrix.T - 等级

标签: python numpy


【解决方案1】:

一般来说,调试代码的第一种方法应该是打印中间结果和相关元数据(例如数组形状)。错误消息还应该告诉您,您的中间数组不具有您期望的形状。

话虽如此,您的代码存在几个问题。

matrix = np.array([trueGrades, (len(grades)), 1])

这条线没有做你认为它做的事情。您在这里所做的只是创建一个包含 [12, 10, 7, 4, 2, 0, -3, 7, 1] 的新数组(通过将 len(grades) 和 1 附加到您的 trueGrades 数组)。

我假设您真正想要的是重塑 trueGrades 通过添加一个单一的维度。可以这样做:

matrix = trueGrades.reshape(-1, 1)  # matrix has shape (len(trueGrades), 1)

然后,为了使广播工作,您的 grades 向量需要相同数量的维度 (2),因此您也需要重新调整它:

grades = grades.reshape(-1, 1)

以下工作正常,那么:

def roundGrade(grades):
    trueGrades = np.array([12, 10, 7, 4, 2, 0, -3])
    matrix = trueGrades.reshape(-1, 1)
    grades = grades.reshape(-1, 1)
    index = np.argmin(np.abs(matrix.T - grades), axis=1)
    gradesRounded = trueGrades[index]
    return gradesRounded
>>> roundGrade(np.arange(-5, 15))
[-3 -3 -3 -3  0  0  2  2  4  4  4  7  7  7 10 10 12 12 12 12]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    相关资源
    最近更新 更多