2017-03-01 28 views
0

私はnumpyを使っていくつかの複雑な関数をプロットしようとしています。いくつかの作業コードの例:Python:配列と非配列の要素的な比較

import numpy as np 
from PIL import Image 

size = 1000 

w = np.linspace(-10, 10, size) 
x, y = np.meshgrid(w, w) 
r = x + 1j*y 

def f(q): 
    return np.angle(q) 

z = f(r) 

normalized = ((255/(np.amax(z) - np.amin(z)))*(z+abs(np.amin(z)))).astype(int) 

data = [i for j in normalized for i in j] 

img = Image.new('L', (size, size)) 
img.putdata(data[::-1]) #pixels are done bottom to top 
img.show() 

しかし、私はこのように、関数fがそれで単純な比較をしたいと仮定します

def f(q): 
    if np.abs(q) < 4: 
     return 1 
    else: 
     return 0 

私はエラーに

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

を取得np.abs(q)<の場合4チェック。

私はいくつかの掘り下げを行い、Pythonがr配列全体で操作を行っており、配列を整数と比較できないことを認識しました。そこで、要素ごとの比較を行う方法を探しました。 (a、b)はそれは私がnp.lessを使って、要素ごとの比較を行うことができますと言うので、私は

def f(q): 
    if np.less(np.abs(q), 4): 
     return 1 
    else: 
     return 0 

を試してみましたが、同じValueErrorをしました:

This pageは有望に見えました。 np.less()の両方の引数が同じサイズの配列である必要があるようです。

私が欲しいのは、アレイの各要素を、配列でない単一の数量と比較することです。私は同じサイズのダミー配列を同一の4でいっぱいにすることができますが、これを行うもっとエレガントな方法が必要です。

答えて

0

キーは、配列を単一のブールに強制するのではなく、配列値を返すことです。これはif (some_array):がしようとしているものです。単一のブール値np.array([True, False])が何に変換されるべきかを決める曖昧さのない方法はありません。試してみることさえありません。

そうでもないブランチを実行します。

def f(q): 
    return abs(q) < 4 

は数字が

>>> f(np.array([1,3,5])).astype(int) 
array([1, 1, 0]) 

のように振る舞うと

を与えるよう

>>> f(np.array([1,3,5])) 
array([ True, True, False], dtype=bool) 

のような配列を与えます210

+0

もし私が分岐する必要があればどうしますか?私がしようとしている実際の問題は、マンデルブロフラクタルをプロットすることです。それは、各点が何らかの関数の反復の下で発散するかどうかを確認することを必要とし、どちらの場合でも異なる処理をする必要があります。 – dain

+0

@dain:次に、個々のブランチを必要としない方法で式を書き直す必要があります(例えば、np.where(np.array([1,2,3])> 2,10,11 ) ')、または方程式をスカラー形式で書いてから' np.vectorize'を使います。あなたは、いくつかのperfを失うでしょう。後者と。脇に:これらのような問題は、あなたの投稿をあなたの実際の目標に似ている方が一般的には良い理由です。あまりに早く単純化すると、あなたが実際に尋ねた質問(「配列の各要素を単一の配列以外の数量と比較することが欲しい」という質問への回答が得られますが、仕事。 – DSM

関連する問題