本文小编为大家详细介绍“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)
根据矩阵乘法广播扩展的原则,只要有一个维度的大小相同就能扩展,但这里却失败了,仔细定位了下,终于找到原因。
问题根因
最后的原因竟然是:打印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)
读到这里,这篇“Python报错ValueError:operands could not be broadcast together with shapes怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。