0

次のブルートフォース方式以外に、if条件が与えられた変数に値を割り当てる簡単な方法はありますか?

方法1:

a, b, c, d = 0.03,0.4,0.055,0.7
x = 0.2

if a < x:
  a = x
if b < x:
  b = x
if c < x:
  c = x
if d < x:
  d = x
4

4 に答える 4

20

多分:

a, b, c, d = max(a, x), max(b, x), max(c, x), max(d, x)

しかし、まったく同じ方法で処理される多くの変数がある場合は、listより良いかもしれません。

values = [0.03,0.4,0.055,0.7]
x = 0.2

values = [max(v, x) for v in values]
于 2013-01-07T12:55:05.987 に答える
2

任意のサイズの配列と次元を処理する 最も効率的な方法numpy.whereを使用することを絶対に検討してください。

#your example:
a,b,c,d = 0.03,0.4,0.055,0.7
x = 0.2

#solution
values = numpy.asarray([a, b, c, d])
a,b,c,d = numpy.where(values<x, x, values)

#efficiency becomes clear when
values = numpy.random.rand(1000,100,10)     #any size and number of dimensions
values = numpy.where(values<x, x, values)   #just works fine and efficient

#further developments would be possible, e.g., multiple conditions
values = numpy.where((values>=0.3)&(values<0.7), 0.5, values)
于 2013-01-07T14:37:03.707 に答える
0

おそらく、もう少し Haskell 風 (zipWith)

from itertools import izip, starmap, repeat

a, b, c, d = starmap(max, izip(repeat(0.2), (0.03, 0.4, 0.055, 0.7)))

いくつかの基本的な時間 (darwin 12.2.0、py 2.7.3):

In [0]: %timeit a,b,c,d = starmap(max, izip(repeat(0.2), (0.03, 0.4, 0.055, 0.7)))
1000000 loops, best of 3: 1.87 us per loop

In [1]: %timeit a,b,c,d = map(max, izip(repeat(0.2), (0.03, 0.4, 0.055, 0.7)))
100000 loops, best of 3: 3.99 us per loop

In [2]: %timeit a,b,c,d = [max(0.2, v) for v in [0.03,0.4,0.055,0.7]]
100000 loops, best of 3: 1.95 us per loop

In [3]: %timeit a,b,c,d = [max(0.2, v) for v in (0.03,0.4,0.055,0.7)]
1000000 loops, best of 3: 1.62 us per loop

結論:

  • タプルはリストより反復処理が速い?!?

  • max(values) は max(*values) よりも高速ですが、starmap は map よりも優れています ?!?

于 2013-01-07T14:57:46.690 に答える
-3

試す:

a = x if a < x else a

b = x if b < x else b

c = x if c < x else c

d = x if d < x else d
于 2013-01-07T12:53:17.270 に答える