55555


matplotlib-quiverで東西、南北の風速を可視化しています。

[code]

    U=nc2['uwnd_c'][0][0][0]
    V=nc2['vwnd_c'][0][0][0]
    plt.quiver(U,V,angles='xy',scale_units='xy',scale=0.5)
    
[/code]

で出力すると  
[![画像の説明をここに入力](https://i.stack.imgur.com/0wtvX.png)](https://i.stack.imgur.com/0wtvX.png)

この画像が出ます。  
やりたいことは、U＝＝1.0、V==1.0のとき地図上に矢印を書きたいです。  
そこで

[code]

    if U==1.0 or V==1.0:
        plt.quiver(U,V,angles='xy',scale_units='xy',scale=0.5)
    else:
        pass
    
[/code]

をやると

[code]

    The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    
[/code]

のエラーが出ます。

調べてもわかりませんでした。  
どこがまちがっているのでしょうか。

参考にしたサイト  
<https://algorithm.joho.info/programming/python/matplotlib-quiver/>


CC BY-SA 4.0
2019-06-05T10:43:26.973
55550
2019-06-05T15:57:41.050
2019-06-05T12:02:25.660
19110
32610
question
python python3 matplotlib
配列から0．１のみをとりだす方法、


`nc2` がどのような変数なのか分からないので `U` や `V` がどのような変数なのかも（特に float なのかも）分かりませんが、`U` と
`V` を `plt.quiver()` の最初の引数として渡しているということは、`U` と `V` はおそらく配列的な何か (array-like)
なのでしょう。挙動から推測するにおそらく NumPy Array になっています。

おそらく質問者さんは配列に対して「1.0 と等しいか？」という比較をしたつもりではなかったのだと思います。`U` と `V`
が具体的にどんな型、形の変数なのかを確認し、そもそもどういうことがしたかったのかを再確認してみてください。

* * *

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

和訳：2つ以上の要素を持った配列の真偽値は曖昧です。`a.any()` か `a.all()` を使ってください。

説明：たとえば `a = np.array([1, 2, 3])` に対して `a == 1` を評価すると要素ごとに比較されて
`np.array([True, False, False])` になります。つまり if 文部分で `if np.array([True, False,
False]):` のような形になってしまい、このような配列から真偽値は定まらないので、何とかしてほしいということを言っているエラーです。


CC BY-SA 4.0
2019-06-05T12:10:24.077
55551
2019-06-05T12:15:27.953
2019-06-05T12:15:27.953
19110
19110
55550
answer


質問内容から推測すると、以下のような感じでしょうか。

  * `U`と`V`が2次元の数値配列
  * `U[y][x]`または`V[y][x]`のどちらかの値が`1.0`だったら有効なデータとし、それ以外の値の場合は両方とも`0.0`に置き換える

`0.0`に置き換えた所は、小さな点になって残るので、まだ完全では無いですが、  
だいたいこんな処理になるのでは？

[code]

    rows = U.shape[0]
    cols = U.shape[1]
    
    for iy in range(rows):
        for ix in range(cols):
            if U[iy][ix] != 1.0 and V[iy][ix] != 1.0:
                U[iy][ix] = 0.0
                V[iy][ix] = 0.0
    
    plt.quiver(U,V,angles='xy',scale_units='xy',scale=0.5)
    
[/code]

元の`U`と`V`を残しておきたい場合、この前に複製を作っておき、それを対象に処理してください。

* * *

あるいは、こちらの方が意図した形でしょうか。

[code]

    rows = U.shape[0]
    cols = U.shape[1]
    
    for iy in range(rows):
        for ix in range(cols):
            if U[iy][ix] == 1.0 or V[iy][ix] == 1.0:
                plt.quiver(ix,iy,U[iy][ix],V[iy][ix],angles='xy',scale_units='xy',scale=0.5)
    
[/code]


CC BY-SA 4.0
2019-06-05T15:04:11.077
55555
2019-06-05T15:57:41.050
2019-06-05T15:57:41.050
26370
26370
55550
answer