Python — 解決“too many indices for array: array is 1-dimensional, but 2 were indexed”問題

Hunter Cheng
Apr 26, 2021

--

開發演算法時,往往會想要確認程式碼所寫出來的最佳解是否正確,但將解帶入目標函數時又會遇到維度問題,此時會跳出 “too many indices for array”,常常令人頭痛不已,而本文會以特別的手法解決此問題。

Photo by Shahadat Rahman on Unsplash
  • 假設目標函數如下,需將生成的亂數帶入 function,以求最佳解:

隨機生成一組 5 * 2 的亂數:(假設D為維度、N為組數)

將上述隨機生成的亂數帶入寫好的 function中,可以得到解如下:

現在我將pop第一組X、Y呼叫出來

如果直接以pop[0]帶入 function會出現以下報錯:

  • 具體原因應該是,原 function寫成的架構是將隨機生成的亂數解,分次提出相對應設定維度的組,再帶入funsum中求fitness,但若是只有一組,系統會自動判定為1-dimensionalfunction就不接受輸入,對一開始設定的這組 function而言,它的input就是要2-dimensional以上的數組,而不能只為1-dimensional的input。

解決方法:設定 function,目的是為求單一1-dimensional型態解的替代方案。

代碼實現如下:

  • 只需將所需要運算的數組輸入在num的位置,就可以算出想要的解。
  • 因應本題範例,則是可以藉此得知運算過程中1-dimensional的 fitness。

結果如下:對應本文一開始 fun(pop) 生成的第一組解是相同的,且資料型態並未跑調,可運用其做其他方面的運算。

代碼分享

def forger_machine(num,D,fun):
pretender = np.zeros(D)
toCalculate = np.row_stack((num, pretender))
testOut = fun(toCalculate)
result = np.delete(testOut, -1, axis=0)
return result

原理分析:

  • function中設定一全為0的D維度矩陣,D為一開始就設定好的全域變數,給他一個很酷的名字,“pretender”。
  • pretender加入到要輸入的1-dimensional下面,這樣一來原本 1-dimensional型態的資料,硬生生就變成了 2-dimensional的資料型態,此時設定的 function就會從不可接受變成可接受了,運算完後再將多算的數組刪除,最後留下的結果,即是一開始就需要的那組一維解。

以上便是筆者針對問題 “too many indices for array: array is 1-dimensional, but 2 were indexed” 的解決方法,希望本文會對你有幫助~

--

--

Hunter Cheng
Hunter Cheng

Written by Hunter Cheng

Master degree of Industrial Management

No responses yet