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

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

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

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

Q&A

解決済

3回答

2522閲覧

python3である行列の全成分がある値のときのみ実行する条件分岐式の書き方。

physics303

総合スコア89

Python

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

0グッド

0クリップ

投稿2018/12/07 00:45

行列Aの全要素が-1の時に、print("HELLO")と出力したい場合は、

python

1if A[:] == -1: 2 print("HELLO")

とすればいいかなと思ったのですが、

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

というエラーが出ます。どうしたらよいでしょうか。

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

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

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

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

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

guest

回答3

0

can110さん回答の前半部分は同意なのですが、コード中の最終行は勘違いを誘発する記述に思えるので補足させてください。

A.all(-1)は「Aの全ての要素が-1か」という意味ではありません。リファレンスを見てもあっさりしすぎていてnumpyの配列関連のメソッドに親しみがないと「なんのこっちゃ」になるかも知れません。(慣れてこないと意味が充分わからないので、例えばaxisという引数が一般的にどういう意味かを知らないといけません)

allやanyは「複数の真偽値を簡約するためのメソッド」です。ここまではcan110さん回答のとおりなのですが・・・

python

1>>> np.array([-1, -1]).all(-1) 2True 3>>> np.array([1, 1]).all(-1) 4True

こうなってしまいます。

allは「要素が真偽値である前提」のメソッドです。上に書いた両方の例がTrueになるのはPythonの真偽値の仕様「数値は0ならFalse、0以外ならTrue」に基づきます。

allの第一引数はaxisであり「比較する値」ではなく「どの軸にそって簡約するか」という意味のものです。axisを省略するかNoneを指定すると全ての軸に対して簡約するという意味になり、意味的には「全ての要素がTrueか」を調べることと同じになります。-1を指定すると「最後の軸に沿って簡約するという意味になります。

それゆえ「全ての要素が-1か」を判定するなら「あらかじめ各要素が-1と等しいか」を演算しておかなければなりません。つまり質問者さんが期待する判定は

(A == -1).all()

となります。こう書くとAがいかなる次元数(ランク)の配列でも「全要素が-1か」という意味になります。

投稿2018/12/07 02:35

KSwordOfHaste

総合スコア18392

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

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

can110

2018/12/07 02:44

> allの第一引数はaxisであり~ この部分を完全に失念していました。マニュアルは確認すべきですね。 ご指摘感謝します!
KSwordOfHaste

2018/12/07 02:55

実はall(-1)という記述を見て「おぉそんな便利な記述が」と思ってリファレンスを確認したら比較値は指定できないらしいことがわかったのですが、 Returns True if all elements evaluate to True. としか書いてなかったので「これじゃぁ見てもわからないかも」と思ったのでコメントしてみたのです。 しかし・・・回答した後にnumpy.allの方にちゃんと詳しい説明があるのに気づきました。ごちゃごちゃ回答に書くより単にnumpy.allのリンクを張った方がよかったです。正直自分も「リファレンスのここに肝心な情報がある」とまではわかっておらず勘で書いちゃってる部分が多いです・・・
guest

0

ベストアンサー

A[:] == -1の結果は複数の真偽値を持ちえます。
if 複数の真偽値:ではどう判断していいか分からないので提示エラーが発生します。
よって以下のように.allまたは.anyで判定条件を明確に与えてあげる必要があります。

Python

1import numpy as np 2A = np.array([-1,-1,-1]) 3print( A[:] == -1) # [ True True True] 4 5# どう判断したらいい?すべてTrue?いずれかTrue? 6#if A[:] == -1: 7# print('HELLO') 8 9# すべてが -1 10if (A == -1).all(): # 全要素について簡約して真偽値を判定 11 print('HELLO')

投稿2018/12/07 01:44

編集2018/12/07 02:42
can110

総合スコア38234

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

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

physics303

2018/12/07 01:49

よくわかりました。ありがとうございます。
guest

0

Use a.any() or a.all()

「どうしたらよいでしょうか」という質問に対してはすでに回答が出ています。エラー文を最後まで読みましょう。

気になる点

行列、ということは2次元配列またはnumpyによる行列表現でしょうか?
a.all() が指定されているということはおそらくnumpyなのでしょうけど…。

numpy.ndarray.all

上記の公式ドキュメントを参考にして実装してみてください。

投稿2018/12/07 01:29

mather

総合スコア6753

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

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

physics303

2020/09/22 07:41 編集

ありがとうございます!all,anyは真偽値判定を行うわけですか?
mather

2018/12/07 01:54

別の方が同じ内容ですでに回答されて解決していますね。 公式ドキュメントもちゃんと読んで、僕の回答の意味もわかりましたか?
physics303

2020/09/22 07:42 編集

はい,わかりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問