2012-09-08 138 views
10

最大/最小振幅が0.5で、下の三角波の形状を形成する100個の数値の配列を生成する最も効率的な方法は何ですか?Pythonでの三角波型配列

念頭に置いて三角波形:

enter image description here

+0

データ構造を整理するか、グラフィック表現を作成するだけですか? –

+0

その形をとる100個のデータエントリの配列を作成するだけで済みます。グラフィック表現は必要ありません! – 8765674

+0

Wikipediaには、三角波を計算するために使用できる3つの異なる式があります:http://en.wikipedia.org/wiki/Triangle_wave#Definitionsより速い方法があるかもしれませんが、これらの式の1つを実装するのはいい出発点です。 –

答えて

8

ジェネレータを使用します。これは、4で割り切れる長さのために正常に動作します

def triangle(length, amplitude): 
    section = length // 4 
    for direction in (1, -1): 
     for i in range(section): 
      yield i * (amplitude/section) * direction 
     for i in range(section): 
      yield (amplitude - (i * (amplitude/section))) * direction 

、あなたは他のために3個までの値を見逃す可能性長さ

>>> list(triangle(100, 0.5)) 
[0.0, 0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.24, 0.26, 0.28, 0.3, 0.32, 0.34, 0.36, 0.38, 0.4, 0.42, 0.44, 0.46, 0.48, 0.5, 0.48, 0.46, 0.44, 0.42, 0.4, 0.38, 0.36, 0.33999999999999997, 0.32, 0.3, 0.28, 0.26, 0.24, 0.21999999999999997, 0.2, 0.18, 0.15999999999999998, 0.14, 0.12, 0.09999999999999998, 0.08000000000000002, 0.06, 0.03999999999999998, 0.020000000000000018, -0.0, -0.02, -0.04, -0.06, -0.08, -0.1, -0.12, -0.14, -0.16, -0.18, -0.2, -0.22, -0.24, -0.26, -0.28, -0.3, -0.32, -0.34, -0.36, -0.38, -0.4, -0.42, -0.44, -0.46, -0.48, -0.5, -0.48, -0.46, -0.44, -0.42, -0.4, -0.38, -0.36, -0.33999999999999997, -0.32, -0.3, -0.28, -0.26, -0.24, -0.21999999999999997, -0.2, -0.18, -0.15999999999999998, -0.14, -0.12, -0.09999999999999998, -0.08000000000000002, -0.06, -0.03999999999999998, -0.020000000000000018] 
+0

私の試みよりもはるかに効率的です。ありがとうございました! – 8765674

+1

'range'を' xrange'に変更します(python <3の場合) – zenpoy

1

numpy fromiterメソッドとともにイテレータジェネレータを使用できます。

import numpy 

def trigen(n, amp): 
    y = 0 
    x = 0 
    s = amp/(n/4) 
    while x < n: 
     yield y 
     y += s 
     if abs(y) > amp: 
      s *= -1 
     x += 1 

a = numpy.fromiter(trigen(100, 0.5), "d") 

ここで、方形波の配列があります。

4

numpyの使用には:

def triangle2(length, amplitude): 
    section = length // 4 
    x = np.linspace(0, amplitude, section+1) 
    mx = -x 
    return np.r_[x, x[-2::-1], mx[1:], mx[-2:0:-1]] 
2

三角形は、鋸歯状の絶対値です。

from scipy import signal 
time=np.arange(0,1,0.001) 
freq=3 
tri=np.abs(signal.sawtooth(2 * np.pi * freq * time)) 
4

三角波を生成する最も簡単な方法は、signal.sawtoothを使用する方法です。 signal.sawtooth(phi、width)は2つの引数を受け取ることに注意してください。最初の引数はフェーズ、次の引数は対称を指定します。 width = 1は右側の鋸歯を与え、width = 0は左側の鋸歯を与え、width = 0.5は対称の三角形を与える。楽しい!

from scipy import signal 
import numpy as np 
import matplotlib.pyplot as plt 
t = np.linspace(0, 1, 500) 
triangle = signal.sawtooth(2 * np.pi * 5 * t, 0.5) 
plt.plot(t, triangle) 
関連する問題