[問題] parameter數量錯誤與逗號問題

看板Python作者 (鹹鹹)時間5年前 (2018/09/13 19:14), 5年前編輯推噓0(0028)
留言28則, 1人參與, 5年前最新討論串1/1
想問一些關於parameter數量錯誤的問題 如果這樣子打 x_train = x_train.apply(np.reshape, args=(60,60,1) ) 則會出現 TypeError:reshape() takes from 2 to 3 positional arguments but 4 were given 但是若改成 x_train = x_train.apply(np.reshape, args=((60,60,1),) ) 之後就可以了,有大大能幫我解惑嗎 上網找一些資訊在後面加逗號似乎會把她變成一個tuple,想請問這個錯誤跟那個又關係嗎 ,另外錯誤顯示的那4個arguments是哪四個呢 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.118.207.2 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1536837246.A.B4D.html

09/13 23:55, 5年前 , 1F
你的第一個寫法,給 np.reshape 的參數就是 3 個
09/13 23:55, 1F

09/13 23:55, 5年前 , 2F
int: 60, 60, 1
09/13 23:55, 2F

09/13 23:57, 5年前 , 3F
修正,正確來說是 4 個,第一個參數由 df.apply 提供
09/13 23:57, 3F

09/13 23:58, 5年前 , 4F
即 np.reshape(x_train, 60, 60, 1) # <- 錯誤
09/13 23:58, 4F

09/13 23:59, 5年前 , 5F
請看 numpy.reshape 的文件: https://goo.gl/wRffJQ
09/13 23:59, 5F

09/14 00:03, 5年前 , 6F
然後 df.apply 的文件:https://goo.gl/BCkX83
09/14 00:03, 6F

09/14 00:03, 5年前 , 7F
args要吃的參數型態就是 tuple
09/14 00:03, 7F

09/14 00:04, 5年前 , 8F
所以給參數的方式就像這樣: args=(x, y, z, ...)
09/14 00:04, 8F

09/14 00:05, 5年前 , 9F
其中 x, y, z 可以是任何型態 (視對象 func 而給)
09/14 00:05, 9F
我前面第一行的程式若改成x_train = x_train.apply(np.reshape, args =((60,60,1)) )的話也會出現同樣的錯誤耶 我也有上網先去看apply的文件我知道要傳入tuple,但是若將(60,60,1)括號起來他不就也變成tuple了嗎,為什麼還要一個逗號呢 ※ 編輯: worthy0429 (219.70.213.17), 09/14/2018 00:25:52

09/14 00:36, 5年前 , 10F
不,你看一下我上面的例子 args=(x, y, z...)
09/14 00:36, 10F

09/14 00:36, 5年前 , 11F
如果僅僅將 60, 60, 1 這三個數包起來,就代表你只給了
09/14 00:36, 11F

09/14 00:38, 5年前 , 12F
修正:就代表 args 拿到 3 個參數,分別為 60, 60, 1
09/14 00:38, 12F

09/14 00:38, 5年前 , 13F
寫成 args=((60, 60, 1), ) 才表示 args 拿到一個參數
09/14 00:38, 13F

09/14 00:39, 5年前 , 14F
叫做 (60, 60, 1) 的 tuple
09/14 00:39, 14F

09/14 00:40, 5年前 , 15F
然後 trailing comma 可以看這篇解釋
09/14 00:40, 15F

09/14 00:41, 5年前 , 16F

09/14 00:42, 5年前 , 17F
簡單來說,如果你沒有給 trailing comma, 僅有單一元素
09/14 00:42, 17F

09/14 00:43, 5年前 , 18F
的 tuple 會和 expression 混淆
09/14 00:43, 18F

09/14 00:44, 5年前 , 19F
* generator expression
09/14 00:44, 19F

09/14 00:45, 5年前 , 20F
或是其他因為內容很長需要多行分段的 code
09/14 00:45, 20F
我有看到,就是a=(1)這樣是int,a=(1),這樣會是tuple,如果單一元素後面家要加逗號才會變tuple ,但是我在想args=(x,y,z),像我這樣子(60,60,1)括號刮起來,不就等於x=(60,60,1)所以已經是tuple了不用再逗號了吧? 我就是一直卡在這邊不好意思,我有聽懂你那個3個int的說法,只是不太清楚為什麼有括號了還是3個int..,你剛傳的那幾個網址 我都有先看過了可是還是覺得卡卡的怪怪的想釐清一下自己的想法 ※ 編輯: worthy0429 (219.70.213.17), 09/14/2018 00:51:28

09/14 00:47, 5年前 , 21F
然後這個行為在 list, dict 上也可以用,但不加上也不
09/14 00:47, 21F

09/14 00:47, 5年前 , 22F
會影響
09/14 00:47, 22F

09/14 01:05, 5年前 , 23F
照你的例子來講,`a=(1),` 和 `a=(1,)` 的 a 都是
09/14 01:05, 23F

09/14 01:05, 5年前 , 24F
tuple
09/14 01:05, 24F

09/14 01:06, 5年前 , 25F
今天如果 args 只拿到 1 個參數,但你仍要確保 args 是
09/14 01:06, 25F

09/14 01:07, 5年前 , 26F
tuple ,你要怎麼做?
09/14 01:07, 26F

09/14 01:08, 5年前 , 27F
情況就是 args=(x),x 可以是任何型別。
09/14 01:08, 27F

09/14 01:26, 5年前 , 28F
這個例子我有看懂,但是若是將裡面的1全部改成'1,2',這樣就會全部都是tuple呀,這跟我60,60,1是一樣的吧.. ※ 編輯: worthy0429 (140.118.207.2), 09/14/2018 17:17:09 抱歉,真的很感謝你但是我是不是鬼打牆了QAQ ※ 編輯: worthy0429 (140.118.207.2), 09/14/2018 17:19:17 就是單一元素需要trail comma,但是60,60,1有三個元素哩 ※ 編輯: worthy0429 (140.118.207.2), 09/14/2018 17:20:39
文章代碼(AID): #1RcaP-jD (Python)