2017-05-12 3 views
1

リストのサイズが異なり、numpy配列にコピーしたいと思います。私はすでにやりたいことがありますが、よりエレガントな方法があるかどうかを確認したいと思います。この後リストをnumpy配列の一部にコピーする

import numpy as np 
data = np.full((10,), np.nan) 

# I want to copy my list into data starting at index 2 
def apply_list(my_list): 
    data[2:2+len(mylist)] = mylist 

# Example 
tmp = [1, 2, 3, 4]  # can vary from 2 to 8 elements 
apply_list(tmp) 

、私はデータがこのように見えることを期待:

[nan, nan, 1, 2, 3, 4, nan, nan, nan, nan] 

len(mylist)は2から8

の範囲とすることができることを覚えておいてください

のは、以下の私が持っていると言います

未使用の場所をNaNでマークし、データが事前に割り当てられており、my_listのサイズに関係なく、常にsize = 10にする必要があります。そのため、単に追加するだけでは機能しません。

私は特にやりたくないのです2:2+len(mylist)。これを行うにはよりきれいな方法がありますか?

+3

これは最も簡単な方法です。 – hpaulj

+0

これをいくつかのイテレータ/ジェネレータと組み合わせる方法はありますか? (明らかに単純なPythonで反復する必要はありません)。私はnp.fromiterについて知っていますが、その割り当てにどのように接続するかはわかりません。 – purpletentacle

+0

スピードやかわいいコードをお探しですか? – hpaulj

答えて

1

これを簡略化できるnumpy関数は認識していません。しかし、複雑さが隠されているので、あなたは関数として、それを包むことができます:

def put(arr, subarr, startidx): 
    arr[startidx:startidx+len(subarr)] = subarr 
    return arr 

またはシーケンシャルインデックス(を推奨しません)と:

def put(arr, subarr, startidx): 
    arr[startidx:][:len(subarr)] = subarr 
    return arr 

あなた可能性もパッドあなたのmylistNaNとS:

np.pad(np.array(mylist, dtype=float), 
     (2, 8-len(mylist)), 
     mode='constant', 
     constant_values=np.nan) 
+0

私はパディングのアイデアが好きですが、パフォーマンスについてはわかりません。 – purpletentacle

+0

「非推奨」についてお詫びして申し訳ありませんが面白そうです。私はそれについて考えたことはありません。なぜ、お勧めしないと言わないのですか? – purpletentacle

+0

私はパッディングが実際にはパフォーマンス的ではないと思っていますが、他のものはより速くなります。私は2番目のアプローチを推奨しませんでした。なぜなら、あまり読みにくいダブルスライス操作を追加するだけで、 'startidx +'を避けるからです。 – MSeifert

関連する問題