2016-04-28 14 views
1

(、n)の形でndarraysのndarrayから特定の要素を取得します:ndarray考える

として表示さ
A = np.array([np.array([1], dtype='f'), 
       np.array([2, 3], dtype='f'), 
       np.array([4, 5], dtype='f'), 
       np.array([6], dtype='f'), 
       np.array([7, 8, 9], dtype='f')]) 

:私は最初の要素から新しい配列を作成しようとしています

A 
array([array([ 1.], dtype=float32), array([ 2., 3.], dtype=float32), 
    array([ 4., 5.], dtype=float32), array([ 6.], dtype=float32), 
    array([ 7., 8., 9.], dtype=float32)], dtype=object) 

私が何を意味するかを示すために、ループを使用したい配列を作成するコードをいくつか以下に示します。私は配列Aがかなり大きい(〜50000項目)ので、同じことを、しかし効率的に達成したいと思います。私は何度も操作を行う必要があります。私は、単一のマスクされた配列に配列の元のジャグ配列を変換することをお勧め

B = np.zeros(len(A)) 
for i, val in enumerate(A): 
    B[i] = val[0] 
B 
array([ 1., 2., 4., 6., 7.]) 

答えて

0

Hすべての要素を1D配列に連結し、最初の要素をlinear-indexingで選択するアプローチです。

lens = np.array([len(item) for item in A]) 
out = np.concatenate(A)[np.append(0,lens[:-1].cumsum())] 

ボトルネックが連結部になりますが、小さな長さを持つ要素の膨大な数がある場合には、オフセットされるかもしれない - の実装は次のようになります。したがって、効率は入力配列の形式に依存します。

+0

ありがとう、これは2つの答えの中で最速です。まだ私が望むほど速くはありませんが、私の素朴なアプローチよりもはるかに改善しました。 – jmc

+0

@jmc元のアプローチよりも改善されていると嬉しいです。 – Divakar

0

B = np.ma.masked_all((len(A), max(map(len, A)))) 

for ii, row in enumerate(A): 
    B[ii,:len(row)] = row 

あなたが持っている:

[[1.0 -- --] 
[2.0 3.0 --] 
[4.0 5.0 --] 
[6.0 -- --] 
[7.0 8.0 9.0]] 

そして、あなたが最初の列をこのように得ることができます。

B[:,0].data