4

Is there a simple way to clear all elements of a numpy array? I tried:

del arrayname

This removes the array completely. I am using this array inside a for loop that iterates thousands of times, so I prefer to keep the array but populate it with new elements every time.

I tried numpy.delete, but for my requirement I don't see the use of subarray specification.

*Edited*:

The array size is not going to be the same.

I allocate the space, inside the loop at the beginning, as follows. Please correct me if this is a wrong way to go about:

arrname = arange(x*6).reshape(x,6)

I read a dataset and construct this array for each tuple in the dataset. All I know is the number of columns is going to be the same but not the number of rows. For example, the first time I might need an array of size (3,6), for the next tuple as (1,6) and the next time as (4,6) and so on. The way I populate the array is as follows:

arrname[:,0] = lstname1
arrname[:,1] = lstname2
...

In other words, the columns are filled from lists constructed from the tuples. So, before the next loop begins I want to clear its elements and make it ready for the consecutive loop since I don't want remnants from the previous loop mixing the current contents.

4

4 に答える 4

5

クリアの意味がわかりません。配列には常にいくつかの値が格納されますが、それらの値を何かに設定できます。たとえば、次のようになります。

>>> A = numpy.array([[1, 2], [3, 4], [5, 6]], dtype=numpy.float)
>>> A
array([[ 1.,  2.],
       [ 3.,  4.],
       [ 5.,  6.]])

>>> A.fill(0)
>>> A
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

>>> A[:] = 1.
>>> A
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

アップデート

まず、あなたの質問は非常に不明確です。良い質問を書くために努力すればするほど、より良い答えが得られます。良い質問は、あなたが何をしようとしているのか、そしてその理由を明確にするものでなければなりません。また、例のデータは非常に役に立ちますが、ほんの少量なので、あなたが何をしようとしているのかを正確に知ることができます.

そうは言っても。反復ごとに新しい配列を作成する必要があるようです。配列の作成は非常に高速ですが、サイズと内容を変更する必要があるときに配列を再利用する理由が明確ではありません。パフォーマンス上の理由で再利用しようとしている場合、おそらく測定可能な違いは見られないでしょう。配列のサイズ変更は、新しい配列を作成するよりも著しく高速ではありません。を呼び出すことで、新しい配列を作成できます。numpy.zeros((X, 6))

また、あなたの質問では次のように述べています。

列は、タプルから構築されたリストから埋められます

データがすでにタプルのリストとして格納されている場合は、それを使用numpy.arrayして配列に変換します。わざわざ配列を作成して埋める必要はありません。たとえば、タプルのリストから (2, 3) 配列を取得したい場合は、次のようにします。

data = [(0, 0, 1), (0, 0, 2)]
A = numpy.array(data)

# or if the data is stored like this
data = [(0, 0), (0, 0), (1, 2)]
A = numpy.array(data).T

それが役立つことを願っています。

于 2012-07-17T00:30:52.813 に答える
3

時期尚早の最適化の可能性について指を振って、いくつかの考えを提供します。

あなたは、以前の繰り返しから残った残り物が欲しくないと言います。あなたのコードから、既知の列数ごとに新しい要素を列ごとに入力しているように見えます。「残り」の値は問題のようには見えません。検討:

  • arange と reshape を使用しても意味がありません。使用してnp.empty((n,6))ください。髪の毛よりonesも速く。zeros

  • または、構成要素から新しい配列を構築することもできます

見る:

lstname1 = np.arange(3)
lstname2 = 22*np.arange(3)
np.vstack((lstname1,lstname2)).T
# returns
array([[ 0,  0],
       [ 1, 22],
       [ 2, 44]])
#or
np.hstack((lstname1[:,np.newaxis],lstname2[:,np.newaxis]))
array([[ 0,  0],
       [ 1, 22],
       [ 2, 44]])

最後に、速度が本当に気になる場合は、予想される最大サイズを割り当てることができます (不明な場合は、要求されたサイズと最後の最大サイズを確認し、それが大きい場合は、を使用np.empty((rows,cols))してサイズを増やします。

次に、反復ごとに、必要な行数だけのより大きなマトリックスのビューを作成します。これにより、numpy は同じバッファー スペースを再利用し、各反復で割り当てを行う必要がなくなります。知らせ:

In [36]: big = np.vstack((lstname1,lstname2)).T

In [37]: smaller = big[:2]

In [38]: smaller[:,1]=33

In [39]: smaller
Out[39]: 
array([[ 0, 33],
       [ 1, 33]])
In [40]: big
Out[40]: 
array([[ 0, 33],
       [ 1, 33],
       [ 2, 44]])

これらは、拡張された質問に明確に適合する提案であり、配列の「クリア」に関する以前の質問には適合しません。smaller.fill(0)後者の例でも、繰り返しで配列のすべての要素を確実に再割り当てするかどうかに応じて、懸念を和らげると簡単に言えます。

于 2012-07-17T21:21:52.663 に答える
2

配列を割り当てたままにして同じサイズにしたい場合は、要素をクリアする必要はありません。現在地を追跡し、配列内の値を上書きするだけです。これが最も効率的な方法です。

于 2012-07-17T02:01:24.067 に答える
0

新しい値を配列に入れ始めるだけです。

ただし、配列をクリアしたい場合は、ゼロまたはを使用して同じサイズの新しい配列を作成してみてください。

>>> A = numpy.array([[1, 2], [3, 4], [5, 6]])
>>> A
array([[1, 2],
       [3, 4],
       [5, 6]])

>>> A = numpy.zeros(A.shape)
>>> A
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])
于 2012-07-17T00:20:45.657 に答える