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

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

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

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

Python

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

Q&A

解決済

1回答

232閲覧

Numpy 3Darrayのインデックスを2Darrayで指定したい(再度)

退会済みユーザー

退会済みユーザー

総合スコア0

NumPy

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

Python

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

0グッド

0クリップ

投稿2019/02/07 03:26

https://teratail.com/questions/172545
にて、np.chooseを使えばよいのではとご回答いただき、試したところchooseは要素数が32までに制限されるようで、再質問させていただきます。前回回答くださった方には、質問の情報が不十分で申し訳ありませんでした。

前提・実現したいこと

(n×m×l)の3次元の配列Aでそれぞれx軸、y軸、z軸と考えます。
z軸のインデックスを与える(n×m)の配列Bを使って、指定するz軸の値を切り出した(n×m)の配列aを得たいです。実際のデータのn,m,lはそれぞれ8000,30,200程度。
つまり以下のコードでやっているようなことです。

python

1import numpy as np 2import itertools 3 4A = np.arange(2*3*4).reshape(2,3,4) #元の三次元配列 5B = np.array([[0,1,1],[1,2,3]]) #Z軸のインデックスを示す配列 6a = np.zeros((2,3))   #Aから指定するZ軸の値を取りだして格納する配列 7 8for i,j in itertools.product([0,1],[0,1,2]): 9 a[i,j] = A[i,j,B[i,j]]

試したこと

numpy.chooseを使う→chooseの要素数の制限でだめ。
Bが示すz軸インデックスの要素のみ1で他は0のAと同じshapeの配列bを作ってA[b==1]で取り出す→一応意図通り動くのだがスマートではないような…
numpy.selectを使うと実現できそうな気がするのですが、conditionをどう書けばよいのかわかりませんでした。

Pythonらしい解決法をご教示いただければ、ありがたいです。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

スマートではないけど。

python

1np.take_along_axis(A, B.reshape([*B.shape, 1]), axis=2).reshape(B.shape)

投稿2019/02/07 04:04

hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2019/02/07 04:46

ご回答ありがとうございます。numpy1.14で止まっていたので、アップデートしてtake_along_axisが使えるようにしました。 実行しようとするとB.reshape([*B.shape, 1])の「*」にinvalid syntax エラーが出るのですが、何をしているどういう文法ですか?不勉強で、初めて見ました。Python2.7でも使えるのでしょうか。
hayataka2049

2019/02/07 05:23

こういう文法です。 >>> [*[1,2,3], 4] [1, 2, 3, 4] python3.5以降のはずです。 代替したければB.shape+(1,)でいいはずです(そっちの方が素直かも)
退会済みユーザー

退会済みユーザー

2019/02/07 05:40

*のついている配列の中身をバラす、みたいな感じでしょうか。3系に切り替えたら使ってみます。 やっているのはBをm×n×1にreshapeするという操作ですね。B.shape+(1,)に置き換えて、できました。ありがとうございました! PS いつもブログで勉強させていただいてます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問