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


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

    问题描述


    在做矩阵数据的归一化处理时,遇到个报错: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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    问题解决


    问题根因

    最后的原因竟然是:打印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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    进阶举例


    对该知识点的深入,可以小结为,[]表示一个维度,如只有一个[],则表示向量,两个嵌套则表示二维矩阵,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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    参考资料


    1. How to Fix: ValueError: Operands could not be broadcast together with shapes?
  • 相关阅读:
    基于ARM的环境参数检测系统设计(Labview+STM32+ZigBee)
    初步认识OpenGL之QT
    《铸梦之路》帧同步卡牌放置手游(斗罗大陆武魂觉醒、上古王冠)
    网络-跨域解决
    Citus 分布式 PostgreSQL 集群 - SQL Reference(SQL支持和变通方案)
    【内存拷贝函数:memcpy与memmove】
    Java面经整理
    【微服务】SpringBoot整合Resilience4j使用详解
    Dell R720服务器已有win10系统下安装Ubuntu10.04双系统
    LC 828 + offerII 101
  • 原文地址:https://blog.csdn.net/qq_17256689/article/details/127911882