解决Python报错:ValueError:operands could not be broadcast together with shapes
作者:来知晓 发布时间:2021-05-14 12:04:53
标签:python,valueerror,报错
问题描述
在做矩阵数据的归一化处理时,遇到个报错: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


猜你喜欢
- datetime 时间包认识 datetime 时间包:date:日期;time:时间;所以 datetime 就是 日期与时间的结合体使用
- Mysql数据库常用命令:启动Mysql数据库C:》cd Mysql5.0 binC:Mysql5.0 bin》mysqld –instal
- 1.去重示例表内容参考此文章有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数
- 1、重装后启动mysql服务,提示 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止。2、查看mysql根目录下有一 计算
- 任务1、我的咖啡馆你做主元组coffee_name=('蓝山','卡布奇诺','拿铁',
- 1. 安装yaml库想要使用python实现yaml与json格式互相转换,需要先下载pip,再通过pip安装yaml库。如何下载以及使用p
- 背景终端(命令行)操作是程序员的必备技能,但是你知道怎么通过golang制作出如下命令吗?$ flag girl -hUsage of gi
- 安装了pycharm之后有一个新装的python解释器,顶替了之前系统的python那样的话,原来利用pip安装的一些库会无法import.
- 这篇日志完全是看了一篇日志后的启发,原文为: * 的eval和new Function。很少使用new Array的方式来定义数组,没想到ne
- 物联网技术开创了一个智慧城市的新时代,从智能摄像头到部署各种传感器,以此对城市各种数据进行收集,并经云端AI技术处理后,有助于提高对交通和街
- 1.max取最大值函数max() 方法返回给定参数的最大值,参数可以为序列。lis = [1,2,3,-4]print(max(lis))
- python3获取控制台输入的数据的方法:可以利用input()函数来获取。python3为我们提供了input()函数,该函数用来接收一个
- GitHub : https://github.com/jayknoxqu/id-number-util身份组成方式中华人民共和国国家标准G
- 也许你刚刚来到一家公司,他们希望进行一些“可用性”工作。你可能是一名UI设计师,业务分析师,或前端开发人员,一名产品经理,或者负责用户体验部
- 目标最近实验室里成立了一个计算机兴趣小组倡议大家多把自己解决问题的经验记录并分享就像在CSDN写博客一样虽然刚刚起步但考虑到后面此类经验记录
- 内容介绍以 Python 使用 线性回归 简单举例应用介绍回归分析。线性回归是利用线性的方法,模拟因变量与一个或多个自变量之间的关系;对于模
- 共同点两者都接收两个参数,第一个参数是行的范围,第二个参数是列的范围不同点loc函数接收的是行/列的名称,iloc函数接收的是行/列的下标(
- 例子:#!/bin/perlprint "Please input an string and a number by order
- 概述迁移学习 (Transfer Learning) 是把已学训练好的模型参数用作新训练模型的起始参数. 迁移学习是深度学习中非常重要和常用
- Flask-WTF扩展可以把处理web表单的过程变成一种愉悦的体验。一、跨站请求伪造保护默认情况下,Flask-WTF能够保护所有表单免受跨