2012-04-12 7 views
22

私はすぐに配列を作成することができますが、この配列のサイズは事前にわかりません。不明な長さのnumpy配列を初期化する

は、例えば、私はこのような何かをしたい:xの含むすべての要素につながる

a= np.array() 
for x in y: 
    a.append(x) 

は、明らかにこれは些細な答えです。これが可能かどうか私はちょうど興味がありますか?

+2

もっと効率的な方法は、大きな配列をいくつか割り当て、容量に達するたびにそのサイズを2倍にすることです。 – wim

答えて

48

はPythonのリストを作成し、numpyの配列にそれを変換します。これは、配列への変換のために、付加的なO(1)+ O(n)の時間を費やして、O(n)の合計になります。後世のために

a = [] 
    for x in y: 
     a.append(x) 
    a = np.array(a) 
+0

それでもいいですね。 'a = np.array([x in x in y])';または単に 'a = np.array(list(y))' –

8

あなたはこれを行うことができます。

a = np.array([]) 
for x in y: 
    a = np.append(a, x) 
+5

追加ごとに線形時間がかかります。 –

+6

このアプローチでは、追加するたびに配列をコピーします。これはO(sum(range(n)))です。私のラップトップでは、この方法は@ larsmanの方法よりも42倍遅かったです。larsmansメソッドに続くリストを作成すると、1ループあたり最大3ループ、つまり1.53ミリ秒かかることになります。この方法に従うと、正確には10ループ、3ループ:64.8 ms /ループが必要です。 –

1

、私はこれが迅速だと思う:

a = np.array([np.array(list()) for _ in y]) 

あなたも発電機に渡すことができるかもしれない(つまり[] - >())、内側のリストがされた場合にはメモリに完全に格納されることはありません。 yは呼び出しが追加する理由は、私が本当に見ていない反復可能であるので

>>> import numpy as np 
>>> y = range(10) 
>>> a = np.array([np.array(list) for _ in y]) 
>>> a 
array([array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object)], dtype=object) 
+0

私はここで変更を加えました:list(_)とうまくいきました – javadba

+0

@javadbaをクリアするには、犯罪になるPythonistasがいくつかあることを確かめてください:) – BenDundee

+0

これはスタイルの問題ではありません。リストなしでは(_)、それは最後のケースではうまくいきません。yは配列自体です – javadba

0
a = np.empty(0) 
for x in y: 
    a = np.append(a, x) 
4


下記のコメントへの対応

a = np.array(list(y)) 

を行いますと、それははるかです速い:

import timeit 

print timeit.timeit('list(s)', 's=set(x for x in xrange(1000))') 
# 23.952975494633154 

print timeit.timeit("""li=[] 
for x in s: li.append(x)""", 's=set(x for x in xrange(1000))') 
# 189.3826994248866 
関連する問題