2017-03-12 13 views
0

私は、特定の時間枠内でリレーのオン/オフをランダムに切り替えるラズベリーパイのプロジェクトを作成しています。タイムスロットを管理するために、毎日生成される2次元配列を使用したいと考えています。だから、私のPythonアプリケーションは、前日の配列を空にして、ランダムに生成されるon/offタイムスロットを設定する必要があります。私はどのように配列に自分の時間値を追加するのか分かりません。誰か助けてくれますか? は、ここに私のコードです:代わりにそれとNumpyが配列に追加する

daily_slots = np.empty([1], dtype=[('onTime', np.dtype(int)), ('offTime', np.dtype(int))]) 
    # numpy populates the array with whatever is in memory at that time, 
    # so delete the existing, 'empty' array row 
    daily_slots = np.delete(daily_slots, 0, 0) 

、私は値を追加しますか? numpyのドキュメントは、私は、次のような何かをしなければならないと言う。

daily_slots = np.append(daily_slots, [700, 800]) 

しかし、それは私が考えることができるすべてを試みたと私はつついとで突いてきた私は

Traceback (most recent call last): 
    File "./controller.py", line 351, in <module> 
    init_app() 
    File "./controller.py", line 128, in init_app 
    build_daily_slots_array() 
    File "./controller.py", line 307, in build_daily_slots_array 
    daily_slots = np.append(daily_slots, [700, 800]) 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 3555, in append 
    return concatenate((arr, values), axis=axis) 
TypeError: invalid type promotion 

を取得し、働いていませんnumpyのドキュメントと私は答えを見つけていない。

配列を正しく宣言していませんか?私は各配列 '行'を2要素の配列(オンタイムとオフフタイム)で構成したいと思います。

+0

numpy appendはverry slowです。numpyは連続したメモリを保証します。代わりにPythonリストを使用してください。 – yar

+0

おそらくリストがほしいだけです。または、本当にいくつかのランダムな値の配列が欲しい場合は、 'np.random'を使います。あなたはほとんど 'np.append'を望んでいません。あなたのアプローチはあまり意味がありません。空の配列を初期化してから行を削除し、行を追加します。これはnumpyを使用する方法ではありません。 –

+0

どちらの回答も私の問題を解決するのに役立ちません。代わりのアプローチを提案することは、その質問に答えておらず、役に立たない。 – johnwargo

答えて

0

np.appendは、np.concatenateを使用します。これは、リスト追加の真のコピーではありません。新しい値を配列に変換し、連結します。 しかし、構造化された配列で連結行うには、すべての配列は同じDTYPE(あるいは少なくとも互換性のもの、それ故に「プロモーション」というエラーを持っている必要が

これは動作します。

In [4]: np.append(daily_slots, np.array((700, 800), dtype=daily_slots.dtype)) 
Out[4]: 
array([( 0, 1075970048), (700,  800)], 
     dtype=[('onTime', '<i4'), ('offTime', '<i4')]) 

これも動作します。 。私はそれらがなければ、それは0Dである第二の配列は、最初のように図1dたよう[]を追加する必要がありました - 。効果中だすべてのことnp.appendがゲームに追加されます

成長と縮小のために
In [6]: np.concatenate((daily_slots, np.array([(700, 800)], dtype=daily_slots.dtype))) 
Out[6]: 
array([( 0, 1075970048), (700,  800)], 
     dtype=[('onTime', '<i4'), ('offTime', '<i4')]) 

、通常はリストが良いです。この場合、2要素タプルのリスト、またはカスタムクラスのリストである可能性があります。

タプルのリストの場合は、np.arrayにラップして計算を簡単にするために2次元配列にすることができます。

+0

私の質問を無視して、単に私がしたいことをしないように言ってくれてありがとう、私の質問に答えてくれてありがとう。あなたは私の問題を解決するのを手助けしているし、同時にnumpyについて少し学びます。私は最近StackOverflowで得られる唯一の答えがなぜであるのかを理解するのに苦労しています。 – johnwargo

関連する問題