2

次のループをベクトル化する方法を理解しようとしています。

for i in range(1,size):
    if a[i] < a[i-1]:
        b[i] = a[i]
    else: b[i] = b[i-1]

bは、aと同じサイズの(大きな)配列です。使用できます

numpy.where(a[1:]<a[:-1])

ifステートメントを置き換えるが、elseステートメントを同時に置き換えるにはどうすればよいですか?

4

2 に答える 2

2

私はあなたがこのようなものが欲しいと思います:

import numpy as np

def foo(a, b):
    # cond is a boolean array marking where the condition is met
    cond = a[1:] < a[:-1]
    cond = np.insert(cond, 0, False)
    # values is an array of the items in from a that will be used to fill b
    values = a[cond]
    values = np.insert(values, 0, b[0])
    # labels is an array of increasing indices into values
    label = cond.cumsum()
    b[:] = values[label]
于 2012-12-18T20:37:53.453 に答える
1

ドキュメントから:

numpy.where(condition[, x, y])

条件に応じて、xまたはyから要素を返します。

したがって、以下を含むループを単純化できます。

if cond:
    a[i] = b[i]
else:
    a[i] = c[i]

a = numpy.where(cond, a, b)

ただし、各要素は前の要素に依存しているため、例をベクトル化できるとは思いません。

于 2012-12-18T17:30:24.273 に答える