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

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

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

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

Python

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

Q&A

解決済

1回答

14357閲覧

Pythonのnumpyで作成した3次元配列に要素をinsertする方法

hitomatagi

総合スコア37

NumPy

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

Python

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

0グッド

0クリップ

投稿2016/08/11 16:50

###実現したいこと
PythonのNumPyで作成した3次元配列(ndarray)に要素をinsertしたいのですが、axsis=2の場合にどうしてもエラーになってしまいます。どのように修正すればよいのかご教授いただけませんでしょうか。

###プログラム

下記プログラムの最後のほうのnp.insert(arr=array1, obj=1, values=array2, axis=2)の部分ででるエラーを解決したいです。

ndarray.py

1import numpy as np 2 3array1 = np.array( 4 [[[ 1, 2, 3, 4], 5 [ 5, 6, 7, 8], 6 [ 9,10,11,12]], 7 8 [[13,14,15,16], 9 [18,19,20,21], 10 [22,23,24,25]]] 11 ) 12print("array1.shape: " + str(array1.shape)) 13array2 = np.array( 14 [[[26], 15 [28], 16 [30]], 17 18 [[32], 19 [34], 20 [36]]] 21 ) 22print("array2.shape: " + str(array2.shape)) 23 24print("===== append =====") 25result = np.append(arr=array1, values=array2, axis=2) 26print(result) 27 28print("===== insert =====") 29result = np.insert(arr=array1, obj=1, values=array2, axis=2) 30print(result)

###実行結果、エラー出力

array1.shape: (2, 3, 4) array2.shape: (2, 3, 1) ===== append ===== [[[ 1 2 3 4 26] [ 5 6 7 8 28] [ 9 10 11 12 30]] [[13 14 15 16 32] [18 19 20 21 34] [22 23 24 25 36]]] ===== insert ===== --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-80-4702bf3c55bc> in <module>() 27 28 print("===== insert =====") ---> 29 result = np.insert(arr=array1, obj=1, values=array2, axis=2) 30 print(result) C:\Users\ksaito\Anaconda3\lib\site-packages\numpy\lib\function_base.py in insert(arr, obj, values, axis) 4491 new[slobj] = arr[slobj] 4492 slobj[axis] = slice(index, index+numnew) -> 4493 new[slobj] = values 4494 slobj[axis] = slice(index+numnew, None) 4495 slobj2 = [slice(None)] * ndim ValueError: could not broadcast input array from shape (3,1,2) into shape (2,3,2)

appendは問題なく動作しましたが、insertではエラーになりました。
また、エラー出力されたfrom shape (3,1,2) into shape (2,3,2)のメッセージが、自分が定義した配列と次元が異なってしまっていて気になっています。

###試したこと

axis=0に対して下記配列のinsertはOKでした。

axis0.py

1axis0 = np.array( 2 [[[26, 27, 28, 29], 3 [30, 31, 32, 33], 4 [34, 35, 36, 37]]] 5 )

また、axis=1に対して下記配列のinsertもOKでした。

axis1.py

1axis1 = np.array( 2 [[[26, 27, 28, 29]], 3 [[34, 35, 36, 37]]] 4 )

###実行環境
環境は以下になります。

  • Python: 3.5.1
  • NumPy: 1.11.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

うまく言い表せないですが、こうなのでは。

array1 = np.array( [[[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9,10,11,12]], [[13,14,15,16], [18,19,20,21], [22,23,24,25]]] ) array2 = np.array( [[[26, 28, 30]], [[32, 34, 36]]] ) result = np.insert(arr=array1, obj=1, values=array2, axis=2) print(result)

もっと言えばこれでもいいと思います。

array1 = np.array( [[[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9,10,11,12]], [[13,14,15,16], [18,19,20,21], [22,23,24,25]]] ) array2 = np.array( [[26, 28, 30], [32, 34, 36]] ) result = np.insert(arr=array1, obj=1, values=array2, axis=2) print(result)

挿入先の次元には 3つ要素があるので、
要素が3つの物ならば挿入できますが、そこには配列([26])は挿入できないので。

appendと違い objを指定しているので、appendでは許される

array1 = np.array( [[[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9,10,11,12]], [[13,14,15,16], [18,19,20,21], [22,23,24,25]]] ) print("array1.shape: " + str(array1.shape)) array2 = np.array( [[[26,27], [28,29], [30,31]], [[32,33], [34,35], [36,37]]] ) print("array2.shape: " + str(array2.shape)) print("===== append =====") result = np.append(arr=array1, values=array2, axis=2) print(result)

はinsertはできませんので、これで言えば

[ 1, 2, 3, 4], ...[26,27]insertして

[ 1, [26, 27], 2, 3, 4], ...

にはできず、次元も大きいのでフラットにもできないのでエラーが起きている様な印象です。
(同様に [ 1, 2, 3, 4], ...[26]insertして [ 1, [26], 2, 3, 4], ...にできない)

カチッとした回答でなくすいません。

投稿2016/08/11 23:20

flied_onion

総合スコア2604

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

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

hitomatagi

2016/08/12 15:25

回答ありがとうございます。 「[ 1, [26], 2, 3, 4], ...にできない」との説明でイメージがつかめました。 また、実行できるパターンを2つ示していただいたので、自分のスクリプトをどのように変更すればよいのかがわかりました。
flied_onion

2016/08/12 15:59

解決の道筋が見つかったようでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問