2017-02-16 14 views
0

リスト内の要素を何度も繰り返し、各繰り返しの後に定数オフセットを追加する整数シーケンスを作成しようとしています。各繰り返しの後にオフセットを追加しながら整数の反復シーケンスを生成する

私は同じN人に関する情報の繰り返しブロックである多くの列を持つpandasデータフレームを持っています。たとえば、列は[age1、age2、age3、... ageN、height1、height2、height3、... heightN、...]であり、私は個人1と4に関連付けられた列を必要とします。特定の個人の列インデックスを生成したいので、df.iloc[:, cindices]を使用してデータフレームのサブセットを作成できます。

次のコードは動作しますが、かなり醜いです。私はより清潔で明確な解決策(もっとPythonic)を望んでいました。

subjects = [1, 4] 
N = 11; repeats = 3 
columns = np.array([(np.arange(repeats) * N + i) for i in subjects]) 
cindices = columns.T.flatten() 

# Information for individuals 1 & 4 are in these columns: 
>> array([ 1, 4, 12, 15, 23, 26]) 

答えて

2

ここでは、ソリューションのnumpythonicバージョンは

(np.array(subjects)[None, :] + N*np.arange(repeats)[:, None]).ravel() 

[None, :]は厳密には必要ではないですが、私は明確にするためにそれを残しました。

+のようなnumpyが有効な演算子を適用すると、ここで起きているのはbroadcastingです。たとえば、(1,2)と(3,1)のシェイプの配列にnumpyは '右の合計は細胞内にある。

ravelは配列を平坦化します。

+1

または単に:(科目+ N * np.arange(繰り返し)[:、なし])。ravel() '。 – Divakar

+0

@Divakarはい、私はそれに来ていました;-) –

+0

両方に投票してください。両方の非常に短い解決策。メルシ。 –

関連する問題