質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

402閲覧

copy行でcopyができない。

sigefuji

総合スコア125

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/09/21 06:36

編集2022/09/21 06:38

前提

copy行でcopyができません。
copy行の意図はval[pt]からx_train[pt*p_jig]にp_jig個コピーをします。
下記のエラーがコピー行で出ます。
エラーの他、気になることは転送先のshapeが(0,10)とあることです。
(0,10)は実体がないと言うことなのでしょうか。
予想としては、shapeあるいは転送indexの問題のようですが、わかりません。
たびたびすみません。

発生している問題・エラーメッセージ

ValueError: could not broadcast input array from shape (10,10) into shape (0,10)

該当のソースコード

python

1import numpy as np 2 3plen=100 4p_jig=10 5tlen=1 6 7val = np.empty(10000) 8val = val.reshape(-1,p_jig) 9 10x_train = np.empty(plen*p_jig) 11x_train = x_train.reshape(-1,p_jig) 12 13print("x_train.shape",x_train.shape) 14 15for pt in range(plen): 16 print("x_train.shape1",x_train.shape,"pt",pt,plen,"val.shape",val.shape) 17 18 x_train[pt*p_jig: pt*p_jig+p_jig] = val[pt: pt+p_jig] #コピー行 19 print("x_train.shape2",x_train.shape) 20 21

試したこと

補足情報(FW/ツールのバージョンなど)

コンソール出力
runfile('C:/book/shuwa/chap05/sec05/untitled1.py', wdir='C:/book/shuwa/chap05/sec05')
x_train.shape (100, 10)
x_train.shape1 (100, 10) pt 0 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 1 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 2 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 3 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 4 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 5 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 6 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 7 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 8 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 9 100 val.shape (1000, 10)
x_train.shape2 (100, 10)
x_train.shape1 (100, 10) pt 10 100 val.shape (1000, 10)
Traceback (most recent call last):

File "C:\Users\qhtsi.conda\envs\py38tfkr\lib\site-packages\spyder_kernels\py3compat.py", line 356, in compat_exec
exec(code, globals, locals)

File "c:\book\shuwa\chap05\sec05\untitled1.py", line 18, in <module>
x_train[ptp_jig: ptp_jig+p_jig] = val[pt: pt+p_jig]

ValueError: could not broadcast input array from shape (10,10) into shape (0,10)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/09/21 06:54

for pt in range(plen): print(pt) print(x_train[pt*p_jig: pt*p_jig+p_jig].shape) print(val[pt: pt+p_jig].shape) を(インデントを入れて)実行したら分かりますが、「pt」が10以上だと 「x_train[pt*p_jig: pt*p_jig+p_jig].shape」 がダメですよね
jbpb0

2022/09/21 06:59 編集

> copy行の意図はval[pt]からx_train[pt*p_jig]にp_jig個コピーをします。 p_jig行 x p_jig列 の2次元配列のコピーになってますよ 一行ずつコピーしたいのでしょうか?
sigefuji

2022/09/21 09:28

私は全然わかっていないのかな? そのshape結果は 0 (10, 10) (10, 10) となりますが、これは2次元を表すのですか? 例えばMNISTの28*28の画像が60000個を学習する場合、件の5章5節(に限りませんが)でMLPモデルで学習するときを見ると、 全体データのshapeは(60000,768)で、それをミニバッチにすると(64,768)になります。 この意味は1個のサンプル長768要素で区切った塊が64個ある1次元配列をreshapeしたndarryを意味しますね。 これと同じ意味で(10,10)はサンプル長10要素が順番に10個並んでいる、1次元のndarryを意味するつもりですが、これは2次元配列なのですか。 このあたり勘違いしているのかな。 言葉ではわかりにくいですね。やはり全体のやりたいことを示してコードで書くべしでしょうね。整理中です。 それはそうとして、今回のエラーはpt>10でエラーになるのはなぜでしょうか?。 どのような計算で。
jbpb0

2022/09/21 09:50 編集

> (10, 10) となりますが、これは2次元を表すのですか? はい 最初の「10」が縦方向の(行)数、二つ目の「10」が横方向の(列)数です > それをミニバッチにすると(64,768)になります。 この意味は1個のサンプル長768要素で区切った塊が64個ある1次元配列をreshapeしたndarryを意味しますね。 縦に64個、横に768個データが並んだ(64行768列の)2次元配列です numpy配列の次元数は「ndim」で表示できるので、確認してみてください xxx = np.zeros((10, 10)) print(xxx.shape) print(xxx.ndim) 参考 https://note.nkmk.me/python-numpy-ndarray-ndim-shape-size/
jbpb0

2022/09/21 10:03

> 今回のエラーはpt>10でエラーになるのはなぜでしょうか?。 「x_train.shape」は「(100, 10)」なので、「x_train[a, b]」で指定できる「a」は0〜99です (ちなみに「b」は0〜9) forループで「pt」が10の場合、 pt*p_jig=100 pt*p_jig+p_jig=110 より、 x_train[pt*p_jig: pt*p_jig+p_jig] = x_train[100: 110] = x_train[100: 110, :] となり、上に書いた「a」の指定できる範囲の0〜99から逸脱した100〜110を指定してます
sigefuji

2022/09/21 11:48

そうでしたか、やはり分かっていなかったです。 (a,b,c)や(a,b)は素直に3次元、2次元と考えておけばよいのですね。 質問のコピー行の考えは1次元で考えていたので、使う変数を先に2次元に変換していたのが間違いでした。 念のため、2つの考えで整理しておきました。 import numpy as np plen=100 p_jig=10 tlen=1 # 1次元ベースで計算し最後に2次元にreshapeする場合 val = np.empty(10000) # 1 dim #val = val.reshape(-1,p_jig) x_train = np.empty(plen*p_jig) # 1 dim #x_train = x_train.reshape(-1,p_jig) for pt in range(plen): ----x_train[pt*p_jig: pt*p_jig+p_jig] = val[pt: pt+p_jig] # 1 dim x_train = x_train.reshape(-1,p_jig) # 2 dim #------------------------------ # 2次元ベースで計算する場合  最初に変数を2次元にreshapeしておく val = np.empty(10000) val = val.reshape(-1,p_jig) # 2 dim x_train = np.empty(plen*p_jig) x_train = x_train.reshape(-1,p_jig) # 2 dim for pt in range(plen): ----x_train[pt*p_jig,0:p_jig] = val[pt,0: p_jig] # 2 dim やはり特殊なコピー(のほどではないが)の場合は、慣れ親しんだ2次元が良いです。 ありがとうございました。
jbpb0

2022/09/22 06:53

それだと、1次元と2次元で結果が変わると思うのですが val = np.empty(10000) ↓ 変更 val = np.arange(10000) と「val」に数値を入れてから処理して、「x_train」が最終どうなるのか確認します 「1次元ベースで計算し最後に2次元にreshapeする場合」 >>> x_train array([[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], [ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.], (中略) [ 98., 99., 100., 101., 102., 103., 104., 105., 106., 107.], [ 99., 100., 101., 102., 103., 104., 105., 106., 107., 108.]]) 「x_train」の全てに値が代入され、行が一つ違うと代入されるデータが一つずれる 0行目:0〜9、1行目:1〜10、、、 「2次元ベースで計算する場合」 (「pt」が10でエラーになる) >>> x_train[:2] array([[0.00000000e+000, 1.00000000e+000, 2.00000000e+000, 3.00000000e+000, 4.00000000e+000, 5.00000000e+000, 6.00000000e+000, 7.00000000e+000, 8.00000000e+000, 9.00000000e+000], [6.01353861e-154, 4.44891543e-086, 1.05089992e-153, 6.01353861e-154, 6.01334510e-154, 4.56360677e-072, 7.06834877e-096, 6.03103059e-154, 8.41789903e-053, 7.07200633e-096]]) >>> x_train[9:12] array([[7.67933572e-043, 7.19739373e+140, 6.01347002e-154, 1.05089598e-153, 4.56340406e-072, 3.85903876e-086, 1.05089825e-153, 4.56340406e-072, 4.66334463e-086, 1.05090053e-153], [1.00000000e+001, 1.10000000e+001, 1.20000000e+001, 1.30000000e+001, 1.40000000e+001, 1.50000000e+001, 1.60000000e+001, 1.70000000e+001, 1.80000000e+001, 1.90000000e+001], [3.65796300e-086, 1.05089768e-153, 4.56340406e-072, 4.46226816e-086, 1.05089996e-153, 4.56340406e-072, 3.25659481e-086, 5.46453470e-095, 6.01347002e-154, 6.03103059e-154]]) 「x_train」で値が代入されるのは0, 10, 20,,,行目だけで、代入されるデータに重複は無い 0行目:0〜9、10行目:10〜19、、、
guest

回答2

0

ベストアンサー

「x_train.shape」は「(100, 10)」なので、「x_train[a, b]」で指定できる「a」は0〜99です
(ちなみに「b」は0〜9)

 
forループで「pt」が10の場合、

pt*p_jig=100 pt*p_jig+p_jig=110

より、

x_train[pt*p_jig: pt*p_jig+p_jig] = x_train[100: 110] = x_train[100: 110, :]

となり、上に書いた「a」の指定できる範囲の0〜99から逸脱した100〜110を指定してます

投稿2022/09/26 02:49

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

お手数をおかけしました

投稿2022/09/27 11:55

sigefuji

総合スコア125

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問