解決Python報(bào)錯(cuò):ValueError:operands?could?not?be?broadcast?together?with?shapes
問題描述
在做矩陣數(shù)據(jù)的歸一化處理時(shí),遇到個(gè)報(bào)錯(cuò):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)
根據(jù)矩陣乘法廣播擴(kuò)展的原則,只要有一個(gè)維度的大小相同就能擴(kuò)展,但這里卻失敗了,仔細(xì)定位了下,終于找到原因。
問題解決
問題根因
最后的原因竟然是:打印Xmin.shape
后顯示的結(jié)果(2,)
,個(gè)人理解錯(cuò)誤。 原以為:(2,)表示的是兩行一列的意思,而實(shí)際上(2,)表示只有1維,是個(gè)向量。
雖然該向量本質(zhì)也是一行兩列,但是為了向量運(yùn)算方便,不區(qū)分方向、行列,而廣播支持的必須是矩陣,維度必須2維及以上。
所以解決方法是升維成二維矩陣,需要將Xmin擴(kuò)維成矩陣,最后的shape表示為(2,1)
,表征2行1列二維數(shù)據(jù),之后就可以進(jìn)行廣播運(yùn)算了。
由此可以看出,對基礎(chǔ)知識的深入理解很重要。
修改方法
在源碼片段第4行后,添加如下其中一種代碼即可:
# 擴(kuò)維方法1 Xmin= Xmin[:, np.newaxis] # 從列的維度擴(kuò)維, shape成(2, 1) Xmax= Xmax[:, np.newaxis] # [np.newaxis, :]則是從行的維度擴(kuò)維,shape成(1, 2) Xmu= Xmu[:, np.newaxis] # 擴(kuò)維方法2 Xmin = Xmin.reshape(X.shape[0], 1) Xmax = Xmax.reshape(X.shape[0], 1) Xmu = Xmu.reshape(X.shape[0], 1)
進(jìn)階舉例
對該知識點(diǎn)的深入,可以小結(jié)為,[]
表示一個(gè)維度,如只有一個(gè)[]
,則表示向量,兩個(gè)嵌套則表示二維矩陣,3個(gè)嵌套則表示三維矩陣。
要做廣播的基礎(chǔ),首先是一維以上的矩陣,系統(tǒng)不支持一維向量的廣播擴(kuò)展。
代碼示例如下:
import numpy as np x1 = [1, 2] # 一維向量,沒有行列之分,只有元素個(gè)數(shù) 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?
總結(jié)
到此這篇關(guān)于解決Python報(bào)錯(cuò):ValueError:operands could not be broadcast together with shapes的文章就介紹到這了,更多相關(guān)Python報(bào)錯(cuò)ValueError內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python ValueError: invalid literal for int() with base 10 實(shí)用解決方法
- Python異常?ValueError的問題
- 解決Python報(bào)錯(cuò)Valueerror: Expected 2d Array Got 1d Array Instead
- Python中ValueError報(bào)錯(cuò)的原因和解決辦法
- Python報(bào)錯(cuò)ValueError: cannot reindex from a duplicate axis的解決方法
- Python報(bào)錯(cuò)ValueError:?cannot?convert?float?NaN?to?integer的解決方法
- 解決Python報(bào)錯(cuò)ValueError list.remove(x) x not in list問題
- Python中異常類型ValueError使用方法與場景
- Python ValueError: all input arrays must have the same shap的問題解決
相關(guān)文章
Python基礎(chǔ)之tkinter圖形化界面學(xué)習(xí)
這篇文章主要介紹了Python基礎(chǔ)之tkinter圖形化界面學(xué)習(xí),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04python+requests+pytest接口自動(dòng)化的實(shí)現(xiàn)示例
這篇文章主要介紹了python+requests+pytest接口自動(dòng)化的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04使用python實(shí)現(xiàn)數(shù)據(jù)篩查
一般數(shù)據(jù)篩查可以通過Python中的pandas庫來實(shí)現(xiàn),下面小編就來為大家介紹一下Python如何利用pandas實(shí)現(xiàn)數(shù)據(jù)篩查,感興趣的小伙伴可以一起學(xué)習(xí)一下2023-10-10在Python中輸入一個(gè)以空格為間隔的數(shù)組方法
今天小編就為大家分享一篇在Python中輸入一個(gè)以空格為間隔的數(shù)組方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11python中常用檢測字符串相關(guān)函數(shù)匯總
這篇文章主要介紹了python中常用檢測字符串相關(guān)函數(shù),實(shí)例匯總了Python針對字符串?dāng)?shù)字、字母、大小寫等常用檢測函數(shù),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Python如何向現(xiàn)有的DataFrame添加新列示例代碼
Pandas庫中的DataFrame是處理表格數(shù)據(jù)的主要數(shù)據(jù)結(jié)構(gòu),添加新列有多種方法,包括使用現(xiàn)有列的值、創(chuàng)建全為零或全為一的列、或者直接添加一個(gè)由特定值組成的列,這些方法在處理數(shù)據(jù)時(shí)非常有用,需要的朋友可以參考下2024-11-11使用python驗(yàn)證代理ip是否可用的實(shí)現(xiàn)方法
驗(yàn)證代理IP是否可用。原理是使用代理IP訪問指定網(wǎng)站,如果返回狀態(tài)為200,表示這個(gè)代理是可以使用的。這篇文章重點(diǎn)給大家介紹使用python驗(yàn)證代理ip是否可用的實(shí)現(xiàn)方法,感興趣的朋友一起看看吧2018-07-07