2

私は友人がPythonで論理アルゴリズムを実行するのを手伝っていましたが、まだ最善の解決策はありません。

まず第一に、私は配列のリストを持っています:

x = array[0,1,2,3,4,3,2,3,-2,-4,-7,2,2]

そして彼はxを分類して、出力が次のようになるようにしたかったのです。

array([0,1,2,3,4]) # increasing value
array([4,3,2]) #decreasing value
array([2,3]) # increasing value
array([3,-2,-4,-7]) #decreasing value
array([-7,2]) # increasing value
array([2,2])  # remain_the_same_value

ルールは単純です:

  1. 値が増加し続ける場合(上記の例のように:0、1、2、3、4)、1つの配列に入れます
  2. 値が減少し続ける場合(上記の例のように:3、-2、-4、-7)、1つの配列に入れます
  3. ただし、上記の例のように値のパターンが突然変化した場合:増加する値(0、1、2、3、4)から、次の値が突然減少します。新しい配列が作成され、最後に増加する値(4)が配置され、値が減少しているかどうかに関係なく、次の値が監視されます。はいの場合、それらは1つの配列に配置されます。例:array([4,3,2])
  4. 値が同じままの場合(上記の例のように、2から2)。それらは1つの配列に配置されます。

これは私がこれまでにやってきたことですが、それでも解決策にはほど遠いです

#categorize which types of input
if len(x) > 2 :
    for i in range(len(x)) :
        if (x[i+1]-x[i]) > 0 and i+i < len(x) : # for increasing x value

        elif (x[i+1]-x[i]) < 0 and i+i < len(x) : # for decreasing x value

        elif (x[i+1]-x[i]) == 0 and i+i < len(x) : # for foward direction of vehicle

        else :
            print 'ERROR : check the input coordinates once again!'

よろしくお願いします、

グレン

4

3 に答える 3

5

まず、私はあなたの質問の一部を理解していないと言いたいのですが、

array([3,-2]) #decreasing value
array([-2,-4,-7]) #decreasing value

なぜこれらは別々なのですか?

私はこれまでのところ私の答えを投稿しますが、その背後にあるロジックがわからないため、そのセクションを除いて正しい結果が得られます。この例では、簡単にするためにリストとタプルを使用していますが、必要に応じて配列を使用するように変更できます。

>>> from itertools import groupby
>>> data = [0,1,2,3,4,3,2,3,-2,-4,-7,2,2]
>>> def slope(a,b): #Returns 1 for inc, 0 for equal and -1 for dec
        return (a > b) - (a < b) 

>>> def groups(nums):
        for k,v in groupby(zip(nums,nums[1:]), lambda (x,y): slope(x,y)):
            yield next(v) + tuple(y for x,y in v) #Using itertools.chain this can be written as tuple(chain(next(v),(y for x,y in v)))


>>> list(groups(data))
[(0, 1, 2, 3, 4), (4, 3, 2), (2, 3), (3, -2, -4, -7), (-7, 2), (2, 2)]
于 2012-05-17T10:45:40.330 に答える
2

実行が変更されるすべての場所を見つけて、両方のエンドポイントを含む実行を生成します。

def sgn(x):
  return (x > 0) - (x < 0)

def categorize(xs):
  endpoints = [0]
  endpoints.extend(i for i, x in enumerate(xs[1:-1], 1)
                   if sgn(x - xs[i - 1]) != sgn(xs[i + 1] - x))
  endpoints.append(len(xs) - 1)
  for e0, e1 in zip(endpoints, endpoints[1:]):
    yield xs[e0:e1 + 1]

print list(categorize([0,1,2,3,4,3,2,3,-2,-4,-7,2,2]))
print list(categorize([0, 1, 2, 3]))
print list(categorize([0]))
于 2012-05-17T10:57:38.063 に答える
0

numpyを使ったこれはどうですか、それは同時にあなたの2番目の問題を解決します。

numpyをnpとしてインポートします

x =(0、1、2、3、4、3、2、3、-2、-4、-7、2、2)
y = range(13)

#一次微分、勾配を見つける
dx = list((np.diff(x)> 0)* 1)

#一次微分は最初の値を失いますが、私たちは常にそれを維持したい
#2番目の値よりも低いか高いかを判断するだけ

d0 =((x [0]-x [1])> 0)* 1

#1次微分を2次微分に追加(ピーク)
ddx = [d0、] + list(np.abs(np.diff(dx)))

p = 0
rx = []
ry = []

enumerate(ddx)のn、vの場合:
    v == 1の場合:
        rx.append(tuple(x [p:n + 1]))
        ry.append(tuple(y [p:n + 1]))
        p = n

rxを印刷する
印刷ry

于 2012-05-17T22:30:54.607 に答える