解决Python报错:ValueError:operands could not be broadcast together with shapes

作者:来知晓 时间:2021-05-14 12:04:53 

问题描述

在做矩阵数据的归一化处理时,遇到个报错:ValueError: operands could not be broadcast together with shapes (2,32) (2,)

源码片段如下:

def normalization(X, set_axis): # for 2d matrix
   Xmin = np.min(X, axis=set_axis) # axis=0, the col min; else, the row min;
   Xmax = np.max(X, axis=set_axis)
   Xmu = np.mean(X, axis=set_axis)
#    print(Xmin.shape)
   X_norm = (X - Xmu) / (Xmax - Xmin)
   return X_norm

X = np.arange(0, 64).reshape(2, 32)
X_norm = normalization(X, 1)

根据矩阵乘法广播扩展的原则,只要有一个维度的大小相同就能扩展,但这里却失败了,仔细定位了下,终于找到原因。

问题解决

问题根因

最后的原因竟然是:打印Xmin.shape后显示的结果(2,),个人理解错误。 原以为:(2,)表示的是两行一列的意思,而实际上(2,)表示只有1维,是个向量。

虽然该向量本质也是一行两列,但是为了向量运算方便,不区分方向、行列,而广播支持的必须是矩阵,维度必须2维及以上。

所以解决方法是升维成二维矩阵,需要将Xmin扩维成矩阵,最后的shape表示为(2,1),表征2行1列二维数据,之后就可以进行广播运算了。

由此可以看出,对基础知识的深入理解很重要。

修改方法

在源码片段第4行后,添加如下其中一种代码即可:

# 扩维方法1
   Xmin= Xmin[:, np.newaxis]  # 从列的维度扩维, shape成(2, 1)
   Xmax= Xmax[:, np.newaxis]  # [np.newaxis, :]则是从行的维度扩维,shape成(1, 2)
   Xmu= Xmu[:, np.newaxis]

# 扩维方法2
   Xmin = Xmin.reshape(X.shape[0], 1)
   Xmax = Xmax.reshape(X.shape[0], 1)
   Xmu = Xmu.reshape(X.shape[0], 1)

进阶举例

对该知识点的深入,可以小结为,[]表示一个维度,如只有一个[],则表示向量,两个嵌套则表示二维矩阵,3个嵌套则表示三维矩阵。

要做广播的基础,首先是一维以上的矩阵,系统不支持一维向量的广播扩展。

代码示例如下:

import numpy as np

x1 = [1, 2]  # 一维向量,没有行列之分,只有元素个数
x2 = [[1], [2]] # 二维矩阵,大小为:2*1
x3 = [[1, 2], [3, 4]] # 二维矩阵,大小为:2*2
x1 = np.array(x1)
x2 = np.array(x2)
x3 = np.array(x3)
print(x1.shape)
print(x2.shape)
print(x3.shape)

参考资料

How to Fix: ValueError: Operands could not be broadcast together with shapes?

来源:https://blog.csdn.net/qq_17256689/article/details/127911882

标签:python,valueerror,报错
0
投稿

猜你喜欢

  • python用tkinter实现一个gui的翻译工具

    2022-12-13 11:30:48
  • python pandas模糊匹配 读取Excel后 获取指定指标的操作

    2022-07-24 07:48:32
  • goland中使用leetcode插件实现

    2023-07-23 10:43:09
  • ThinkPHP模板判断输出Empty标签用法详解

    2023-11-14 20:46:54
  • TensorFlow的reshape操作 tf.reshape的实现

    2022-03-31 01:14:13
  • 下一站:HandlerSocket!

    2011-04-11 09:02:00
  • Python入门之后再看点什么好?

    2023-07-17 07:04:29
  • Python在不同目录下导入模块的实现方法

    2022-03-12 09:34:52
  • SQL Server中实现二进制与字符类型之间的数据转换

    2023-07-17 21:34:47
  • python 的生产者和消费者模式

    2021-09-18 07:19:45
  • Python实现扩展内置类型的方法分析

    2021-10-18 02:05:06
  • 正则的replace方法(产生的字符串副本)

    2008-06-03 13:31:00
  • BigPipe:高性能的"流水线技术"网页

    2010-11-02 12:47:00
  • MySQL数据库的其它安全问题

    2008-12-23 15:40:00
  • 浅析python3字符串格式化format()函数的简单用法

    2021-03-26 15:05:49
  • python list.sort()根据多个关键字排序的方法实现

    2021-05-22 03:16:09
  • Python实现Harbor私有镜像仓库垃圾自动化清理详情

    2021-02-08 17:09:46
  • python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

    2022-09-10 20:01:20
  • python 获取页面表格数据存放到csv中的方法

    2021-01-28 02:13:48
  • 深入Python解释器理解Python中的字节码

    2022-04-28 18:29:33
  • asp之家 网络编程 m.aspxhome.com