🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

982閲覧

配列の入れ替えアルゴリズム

teefpc

総合スコア112

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/14 05:46

編集2019/10/14 08:36

Numpyのtranspose のアルゴリズムを教えてください

以下のようなn次元配列A (1x2x3x4)を 軸を入れ替えて 例えばn次元配列[3x4x1x2]にするのが transposeメソッドですが、これをfor文で書くとどうなりますか?

JavaScript

1// 例 x:入力 2x=[ 3 [ 4 [ 5 [1,2,3,4], 6 [5,6,7,8], 7 [9,10,11,12], 8 ], 9 [ 10 [1,2,3,4], 11 [5,6,7,8], 12 [9,10,11,12], 13 ], 14 ] 15] 16 17 // 出力:out 18 // 初期化 19 let out = [] 20 for (let d0 = 0 ; d0 < x[0][0].length; d0++){ 21 out[d0] = [] 22 for (let d1 = 0 ; d1 < x[0][0][0].length ; d1++){ 23 out[d0][d1] = [] 24 for (let d2 = 0 ; d2 < x.length ; d2++){ 25 out[d0][d1][d2] = [] 26 for (let d3 = 0 ; d3 < x[0].length ; d3++){ 27 out[d0][d1][d2][d3] = 0 28 } 29 } 30 } 31 } 32

【追加質問です】
6次元のデータを使った例です。
numpy の場合、out = x.transpose(0, 4, 5, 1, 2, 3) です。

JavaScript

1<script> 2// 例 x:入力 6次元配列(1x1x3x3x4x4) 3// -> out :出力 6次元配列(1x4x4x1x3x3) へ軸変換 4 5x=[ 6 [[ 7 // * 8 [ 9 [ 10 [1,1,1,1], 11 [1,1,1,1], 12 [1,1,1,1], 13 [1,1,1,1], 14 ], 15 [ 16 [1,1,1,1], 17 [1,1,1,1], 18 [1,1,1,1], 19 [1,1,1,1], 20 ], 21 [ 22 [1,1,1,1], 23 [1,1,1,1], 24 [1,1,1,1], 25 [1,1,1,1], 26 ], 27 ], 28 29 // ** 30 [ 31 [ 32 [1,1,1,1], 33 [1,1,1,1], 34 [1,1,1,1], 35 [1,1,1,1], 36 ], 37 [ 38 [1,1,1,1], 39 [1,1,1,1], 40 [1,1,1,1], 41 [1,1,1,1], 42 ], 43 [ 44 [1,1,1,1], 45 [1,1,1,1], 46 [1,1,1,1], 47 [1,1,1,1], 48 ], 49 ], 50 // *** 51 [ 52 [ 53 [1,1,1,1], 54 [1,1,1,1], 55 [1,1,1,1], 56 [1,1,1,1], 57 ], 58 [ 59 [1,1,1,1], 60 [1,1,1,1], 61 [1,1,1,1], 62 [1,1,1,1], 63 ], 64 [ 65 [1,1,1,1], 66 [1,1,1,1], 67 [1,1,1,1], 68 [1,1,1,1], 69 ], 70 ], 71 72 ]] 73] 74 75console.log(x) 76 77let out = [] 78for (let d0 = 0 ; d0 < x.length; d0++){//1 79 out[d0] = [] 80 for (let d1 = 0 ; d1 < x[0][0][0][0].length ; d1++){//4 81 out[d0][d1] = [] 82 for (let d2 = 0 ; d2 < x[0][0][0][0][0].length ; d2++){//4 83 out[d0][d1][d2] = [] 84 for (let d3 = 0 ; d3 < x[0].length ; d3++){//1 85 out[d0][d1][d2][d3] = [] 86 for (let d4 = 0 ; d4 < x[0][0].length ; d4++){//3 87 out[d0][d1][d2][d3][d4] = [] 88 for (let d5 = 0 ; d5 < x[0][0][0].length ; d5++){//3 89 console.log(`out[${d0}][${d1}][${d2}][${d3}][${d4}][${d5}] = ${x[d0][d4][d5][d1][d2][d3]}`); 90 out[d0][d1][d2][d3][d4][d5] = x[d0][d4][d5][d1][d2][d3] 91 } 92 } 93 } 94 } 95 } 96} 97console.log(out) 98</script>

実行すると、
Uncaught TypeError: Cannot read property '0' of undefined
のエラーでストップします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

訂正版

4次元

JavaScript

1let out = [] 2for (let d0 = 0 ; d0 < x[0][0].length; d0++){ 3 out[d0] = [] 4 for (let d1 = 0 ; d1 < x[0][0][0].length ; d1++){ 5 out[d0][d1] = [] 6 for (let d2 = 0 ; d2 < x.length ; d2++){ 7 out[d0][d1][d2] = [] 8// for (let d3 = 0 ; d3 < x[0].length ; d3++){ 9// } 10 } 11 } 12} 13 14for (let d0 = 0 ; d0 < x.length; d0++){ 15 for (let d1 = 0 ; d1 < x[0].length ; d1++){ 16 for (let d2 = 0 ; d2 < x[0][0].length ; d2++){ 17 for (let d3 = 0 ; d3 < x[0][0][0].length ; d3++){ 18 console.log(`out[${d2}][${d3}][${d0}][${d1}] = ${x[d0][d1][d2][d3]}`); 19 out[d2][d3][d0][d1] = x[d0][d1][d2][d3]; 20 } 21 } 22 } 23}

6次元

JavaScript

1let out = [] 2for (let d0 = 0 ; d0 < x.length; d0++){//1 3 console.log(`${d0}`) 4 out[d0] = [] 5 for (let d1 = 0 ; d1 < x[0][0][0][0].length ; d1++){//4 6 console.log(`${d0} ${d1}`) 7 out[d0][d1] = [] 8 for (let d2 = 0 ; d2 < x[0][0][0][0][0].length ; d2++){//4 9 console.log(`${d0} ${d1} ${d2}`) 10 out[d0][d1][d2] = [] 11 for (let d3 = 0 ; d3 < x[0].length ; d3++){//1 12 console.log(`${d0} ${d1} ${d2} ${d3}`) 13 out[d0][d1][d2][d3] = [] 14 for (let d4 = 0 ; d4 < x[0][0].length ; d4++){//3 15 console.log(`${d0} ${d1} ${d2} ${d3} ${d4}`) 16 out[d0][d1][d2][d3][d4] = [] 17// for (let d5 = 0 ; d5 < x[0][0][0].length ; d5++){//3 18// } 19 } 20 } 21 } 22 } 23} 24 25for (let d0 = 0 ; d0 < x.length; d0++){ 26 for (let d1 = 0 ; d1 < x[0].length ; d1++){ 27 for (let d2 = 0 ; d2 < x[0][0].length ; d2++){ 28 for (let d3 = 0 ; d3 < x[0][0][0].length ; d3++){ 29 for (let d4 = 0 ; d4 < x[0][0][0][0].length ; d4++){ 30 for (let d5 = 0 ; d5 < x[0][0][0][0][0].length ; d5++){ 31 console.log(`out[${d0}][${d4}][${d5}][${d1}][${d2}][${d3}] = ${x[d0][d1][d2][d3][d4][d5]}`); 32 out[d0][d4][d5][d1][d2][d3] = x[d0][d1][d2][d3][d4][d5] 33 } 34 } 35 } 36 } 37 } 38}

1回目の回答: 間違いかも

こういう話ですか・・?

JavaScript

1out[d0][d1][d2][d3] = 0

JavaScript

1out[d0][d1][d2][d3] = x[d2][d3][d0][d1];

JavaScript

1console.log(`out[${d0}][${d1}][${d2}][${d3}] = ${x[d2][d3][d0][d1]}`);

投稿2019/10/14 06:27

編集2019/10/14 09:33
tanishi_a

総合スコア484

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

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

teefpc

2019/10/14 06:54

ありがとうございます。console.logのコードは、PHPみたいで動きませんでしたが、変数out自体の軸の入れ替えは通りました。本番に適用してみます。
miyabi_takatsuk

2019/10/14 07:08 編集

横槍失礼します。 teefpcさん>PHPではありません。 (むしろPHPだと違う結果になってしまうか動かない) JavaScriptのテンプレートリテラル記法です。 動かないということは、古めのブラウザか、実行環境をお使いですかね? (IEとか)
tanishi_a

2019/10/14 07:10

補足ありがとうございます。同様の理解です。
teefpc

2019/10/14 07:56 編集

Google Chrome バージョン: 77.0.3865.120(Official Build) (64 ビット)最新版です。 動かすと、 Uncaught ReferenceError: d0 is not defined at im2col_test.html:31 と出力されました。が、let またはvar でloop内で動かしていたのでした。loop の外で宣言すれはOKでした。失礼いたしました。
tanishi_a

2019/10/14 07:57

ああなるほど。まぎらわしくてすみません。 console.log を書いたのは、結果の表示ではなくて、 途中過程の表示のために書いたものです。 なので、貼る場合は、ループの外ではなく、 下記の行と同じ並びに貼ってください。 out[d0][d1][d2][d3] = x[d2][d3][d0][d1];
teefpc

2019/10/14 08:19

すごいです。こんなことができるんですね。感動しました。 ところで、6次元配列で実行したところ、うまくいかなんです。長くなるので、上の質問にコードを追加してもいいでしょうか。
tanishi_a

2019/10/14 08:21

変なところで感心された。 質問を編集すること自体は問題ないと思います。回答出来るかはわかりませんが。
teefpc

2019/10/14 08:37

見ていただけるだけでもありがたいです。
tanishi_a

2019/10/14 09:34

1個目の回答、間違ってた気がしてきました。 訂正版を載せましたが、、あまり自信がないので、 期待する結果になってるかどうか、確認してみてください・・・。
teefpc

2019/10/14 10:43 編集

こちらの方がもっとすごいです!ぴったりNumpy での結果と一致しました。
tanishi_a

2019/10/14 10:51

そうですね。 ハコだけ先に作ってあとから並べ替えた値を入れている、という理解で合ってます。 うまくすればもとの方式でも行けるのかもしれないですが、 考えてるうちによく分からなくなってしまったので、ループを2つに分けました。 期待した結果と合っていたようでよかったです。
teefpc

2019/10/14 11:40

どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問