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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

218閲覧

pythonで関数への入力を複数処理する方法を教えてください

taichi1602

総合スコア25

NumPy

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2023/12/02 23:22

編集2023/12/03 11:54

pythonでnumpyのeinsumを使用するときに9個の配列を1つのデータとしてを一つずつ処理しているのですが、
これを複数入力データに対応できるようにバッチ処理を行いたいのですが、どのようにすればよいでしょうか。

バッチ処理していないeinsum計算が下記です。

python

1import numpy as np 2 3def einsum_test(x): 4 A1 = np.arange(4).reshape(2,2) 5 A2 = np.arange(8).reshape(2,2,2) 6 A3 = np.arange(4).reshape(2,2) 7 8 I0 = torch.tensor([1, 0]) 9 I1 = torch.tensor([0, 1]) 10 11 I = I0 if x[0] == 0 else I1 12 y = np.einsum("ia,i->a",A1,I) 13 I = I0 if x[1] == 0 else I1 14 y = np.einsum("a,aib,i->b",y,A2,I) 15 I = I0 if x[2] == 0 else I1 16 y = np.einsum("a,ai,i->...",y,A3,I) 17 18 return y 19 20x = np.array([1,1,1]) 21y = einsum_test(x) 22print(y)

output

1103

この処理を複数の入力で処理したいです。
xを多次元配列にして、これを入力としたいのですが、
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
とエラーが出てしまいます。

x

1x = np.array([[1,1,1],[0,1,0],[0,0,1]])

python

1import numpy as np 2 3def einsum_test_batch(x): 4 A1 = np.arange(4).reshape(2,2) 5 A2 = np.arange(8).reshape(2,2,2) 6 A3 = np.arange(4).reshape(2,2) 7 8 I0 = torch.tensor([1, 0]) 9 I1 = torch.tensor([0, 1]) 10 11 I = I0 if x[:,0] == 0 else I1 12 y = np.einsum("ia,i->a",A1,I) 13 I = I0 if x[:,1] == 0 else I1 14 y = np.einsum("a,aib,i->b",y,A2,I) 15 I = I0 if x[:,2] == 0 else I1 16 y = np.einsum("a,ai,i->...",y,A3,I) 17 18 return y 19 20x = np.array([[1,1,1],[0,1,0],[0,0,1]]) 21y = einsum_test_batch(x) 22print(y)

このプログラムを修正して下記の出力となるようにできますか?

expect

1103 214 319

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

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

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

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

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

winterboum

2023/12/03 00:34

バッチ処理 ってどういうことを指してます? 一般的にはメインで動いているプロセスとは別に cron(unix系のOSなら) などで適宜起動させて処理することを言います。 そういう意味でしたら そのプログラムを cronで実施するように crontabを書くだけ。
taichi1602

2023/12/03 00:43

質問ありがとうございます。機械学習でいうところの複数の入力に対するバッチ処理を想定していました。 誤解を生み表現なので質問内で訂正します。
meg_

2023/12/03 00:43

> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()とエラーが出てしまいます。 エラーメッセージは抜粋でなく(個人情報以外の)全文を載せていただけませんか?
guest

回答1

0

ベストアンサー

以下は numpy.vectorize を使う方法です。

python

1import torch 2import numpy as np 3 4def einsum_test_batch(x): 5 A1 = np.arange(4).reshape(2,2) 6 A2 = np.arange(8).reshape(2,2,2) 7 A3 = np.arange(4).reshape(2,2) 8 9 I0 = torch.tensor([1, 0]) 10 I1 = torch.tensor([0, 1]) 11 12 I = I0 if x[0] == 0 else I1 13 y = np.einsum("ia,i->a",A1,I) 14 I = I0 if x[1] == 0 else I1 15 y = np.einsum("a,aib,i->b",y,A2,I) 16 I = I0 if x[2] == 0 else I1 17 y = np.einsum("a,ai,i->...",y,A3,I) 18 19 return y 20 21x = np.array([[1,1,1],[0,1,0],[0,0,1]]) 22y = np.vectorize(einsum_test_batch, signature='(n)->()')(x) 23print(y) 24 25# [103 14 19]

投稿2023/12/03 00:44

melian

総合スコア19490

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

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

taichi1602

2023/12/03 02:54

回答ありがとうございます。質問の回答としては十分ですが、テンソルの自分微分をTrueとしたときにnp.vectorizeが出来ませんでした。申し訳ないのですが、質問修正させてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問