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

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

新規登録して質問してみよう
ただいま回答率
85.46%
多次元配列

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

NumPy

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2500閲覧

numpyにおいて、三次元配列の一部の配列をシャッフルした配列を作成できない

kaneko_

総合スコア9

多次元配列

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

NumPy

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/04/12 11:10

前提・実現したいこと

numpyで三次元配列の一部をシャッフルした配列を作りたい
エラーは出ないのですが、望んだ値が出ません。なんとなく原因はわかるのですが、どう直せばいいのかわかりません。
実行したいプログラムは以下のとおりです。
0. 333の三次元配列を作成する
0. その三次元配列から二次元配列の要素を取り出す
0. 取り出した二次元配列の、x成分のみをシャッフルする
0. シャッフルした二次元配列をもとの三次元配列にコピーする

今まで試した結果から、step1~3はおそらくうまく行っているのですが、step4で正しくペーストできていないのではないかと思っています。ただ、どのように配列の次元を合わせてペーストすればいいのかがわかりません。
もしわかる方がいらっしゃいましたら、ご回答よろしくおねがいします。

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

エラーはありません。
正しい値が出力されません。

該当のソースコード

python

1import numpy as np 2 3a=np.array([[[0,0,0],[1,0,1]],[[0,0,0],[0,0,0]]]) 4l=list(a[0:2,1,:]) 5print(a) 6np.random.shuffle(l) 7print(l) 8a[0:2,1,:]=l 9print(a)

result

1[[[0 0 0] 2 [1 0 1]] 3 4 [[0 0 0] 5 [0 0 0]]] 6[array([0, 0, 0]), array([1, 0, 1])] 7[[[0 0 0] 8 [0 0 0]] 9 10 [[0 0 0] 11 [0 0 0]]]

試したこと

問題を簡単化しようとした結果、表題の問題にたどり着きました。

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

google colabにて記述

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

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

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

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

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

guest

回答2

0

質問を読んでも何をしたいのかが理解できませんので、可能性のある答えを書いておきます。

3個の軸をaxis0, axis1, axis2と書くことにします。

元のndarrayを以下とします。(全ての要素が違う方が見やすいからです)

python

1>>> print(a) 2[[[ 0 1 2] 3 [ 3 4 5] 4 [ 6 7 8]] 5 6 [[ 9 10 11] 7 [12 13 14] 8 [15 16 17]] 9 10 [[18 19 20] 11 [21 22 23] 12 [24 25 26]]]

shapeが(3,3,3)であるndarrayのどれかの軸方向の3個の要素をシャッフルしたい場合
axis0方向に2, axis2方向に1である要素、つまり19と22と25をシャッフルする例

python

1import numpy as np 2 3a = np.arange(27, dtype=int).reshape(3,3,3) 4print(a) 5axis0, axis2 = 2, 1 6print(a[axis0,:,axis2]) 7np.random.shuffle(a[axis0,:,axis2]) 8print(a)

実行結果

python

1>>> np.random.shuffle(a[axis0,:,axis2]) 2>>> print(a) 3[[[ 0 1 2] 4 [ 3 4 5] 5 [ 6 7 8]] 6 7 [[ 9 10 11] 8 [12 13 14] 9 [15 16 17]] 10 11 [[18 22 20] 12 [21 19 23] 13 [24 25 26]]]

shapeが(3,3,3)であるndarrayのどれかの軸と直交するの9個の要素をシャッフルしたい場合
axis2が0である要素、つまり0、3、6、9、12、15、18、21、24をシャッフルする例

python

1import numpy as np 2 3a = np.arange(27, dtype=int).reshape(3,3,3) 4print(a) 5axis2 = 0 6print(a[:,:,axis2]) 7np.random.shuffle(a[:,:,axis2].reshape(9)) 8print(a)

実行結果

python

1>>> np.random.shuffle(a[:,:,axis2].reshape(9)) 2>>> print(a) 3[[[ 9 1 2] 4 [ 6 4 5] 5 [21 7 8]] 6 7 [[12 10 11] 8 [24 13 14] 9 [15 16 17]] 10 11 [[18 19 20] 12 [ 0 22 23] 13 [ 3 25 26]]]

軸の方向とか値とかを変えてみればkaneko_さんの望むものができるかもしれません。

投稿2021/04/13 00:42

ppaul

総合スコア24666

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

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

kaneko_

2021/04/13 00:51

丁寧にありがとうございました。
guest

0

ベストアンサー

333の三次元配列を作成する

今のコードだと(2,2,3)の配列になっていますが、よろしいのでしょうか……

基本的にはlistにするべきではなく、numpy配列のまま取り扱います。また、x成分と言っているのがaxis=0か1かわからないのですが、numpy.random.shuffleはaxis=0(二次元なら行)でシャッフルが為されることに注意が必要です。axis=1が欲しい場合は、apply_along_axisが使えます

などを考慮すると、こんな感じでしょうか。

python

1import numpy as np 2 3a = np.array([[[0,0,0],[1,0,1]],[[0,0,0],[0,0,0]]]) 4l = a[0:2,1,:] 5print(a) 6 7## どっちかを選んでください 8# axis=0 9# np.random.shuffle(l) 10 11# axis=1 12# np.apply_along_axis(np.random.shuffle, 1, l) 13 14## ビューなのでこの行は要らんという考えもあり。ただ可読性を考慮すると消さない方が良いかも 15# a[0:2,1,:] = l 16 17 18print(a)

投稿2021/04/12 11:27

hayataka2049

総合スコア30933

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

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

kaneko_

2021/04/13 00:51

ありがとうございます。listとarrayは混ぜて使うべきではないのですね、今後気をつけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問