numpy配列を初期化する


129

形状の派手な配列を初期化してそれに追加する方法はありますか?リストの例で必要なものを説明します。ループで生成されたオブジェクトのリストを作成する場合は、次のようにできます。

a = []
for i in range(5):
    a.append(i)

numpy配列で同様のことをしたいのですが。私はvstackやconcatenateなどについて知っています。しかし、これらは入力として2つのnumpy配列を必要とするようです。私が必要なのは:

big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
    array i of shape = (2,4) created.
    add to big_array

big_array形状を持つべきです(10,4)。これを行う方法?


編集:

次の説明を追加したいと思います。私はそれを定義big_array = numpy.zeros((10,4))してそれを埋めることができることを知っています。ただし、これには事前にbig_arrayのサイズを指定する必要があります。この場合、サイズはわかりますが、知らない場合はどうなりますか?.appendPythonでリストを拡張する関数を使用する場合、事前に最終的なサイズを知る必要はありません。空の配列から始めて、小さな配列からより大きな配列を作成するために似たようなものが存在するかどうか疑問に思っています。


ちなみに、最初のコードサンプルは、リスト内包表記として、簡潔に簡潔に記述できます[i for i in range(5)]。(同等:list(range(5))これは人為的な例ですが)
Katriel 2010

どのソリューションが効果的でしたか?私は私x = numpy.array()たちがリストのようにするのと同じように何かをしようとしていy = []ます; しかし、それはうまく
いき

回答:


160

numpy.zeros

ゼロで埋められた、指定された形状とタイプの新しい配列を返します。

または

numpy.ones

与えられた形状とタイプの新しい配列を返します。

または

numpy.empty

エントリを初期化せずに、指定された形状とタイプの新しい配列を返します。


ただし、リストに要素を追加して配列を作成するメンタリティは、効率が悪いため、numpyではあまり使用されません(numpyデータ型は、基になるC配列に非常に近くなります)。代わりに、配列を必要なサイズに事前に割り当ててから、行を埋めてください。numpy.appendただし、必要に応じて使用できます。


2
big_array = numpy.zerosを設定して、作成した小さな配列で埋めることができることを知っています。ただし、これには事前にbig_arrayのサイズを指定する必要があります。事前にサイズを指定していないlist関数の.appendのようなものはありませんか?ありがとう!
Curious2learn 2010

2
@ Curious2learn。いいえ、Numpyにはappendのようなものはまったくありません。配列を連結したり、新しい配列を作成してそれらをスタックしたりする関数がありますが、それらは追加によってそうしません。これは、データ構造のセットアップ方法が原因です。Numpy配列は、値をよりコンパクトに格納できるため高速になっていますが、この速度を得るには固定サイズにする必要があります。Pythonリストは、速度とサイズを犠牲にしてより柔軟になるように設計されています。
ジャスティンピール2010

3
@好奇心が強い:まあ、乱暴にありappendます。事前割り当てを行わない方が効率的ではないだけです(この場合、append毎回配列全体をコピーするため、はるかに効率的ではありません)。したがって、これは標準的な手法ではありません。
Katriel 2010

1
np.empty配列の一部のみが値で埋められている場合はどうなりますか?残りの「空の」アイテムはどうですか?
リー

1
幅しかわからない場合(たとえばに必要np.concatenate())、次のように初期化できますnp.empty((0, some_width))。0なので、最初の配列はゴミになりません。
NumesSanguis 2017

40

私が通常行う方法は、通常のリストを作成してから、それにデータを追加し、最後に次のようにリストをnumpy配列に変換することです。

import numpy as np
big_array = [] #  empty regular list
for i in range(5):
    arr = i*np.ones((2,4)) # for instance
    big_array.append(arr)
big_np_array = np.array(big_array)  # transformed to a numpy array

もちろん、最終的なオブジェクトは作成ステップでメモリの2倍のスペースを取りますが、Pythonリストへの追加は非常に高速で、np.array()を使用して作成することもできます。


11
配列のサイズが事前にわかっている場合、これは適切な方法ではありませんが、配列がどのくらいの大きさになるかわからないときに、この方法を頻繁に使用することになります。たとえば、ファイルまたは別のプロセスからデータを読み取る場合。pythonとnumpyはかなり賢いので、最初に思われるほどひどくはありません。
トラック

18

numpy 1.8で導入:

numpy.full

fill_valueで満たされた、指定された形状とタイプの新しい配列を返します。

例:

>>> import numpy as np
>>> np.full((2, 2), np.inf)
array([[ inf,  inf],
       [ inf,  inf]])
>>> np.full((2, 2), 10)
array([[10, 10],
       [10, 10]])

13

Pythonの配列アナログ

a = []
for i in range(5):
    a.append(i)

です:

import numpy as np

a = np.empty((0))
for i in range(5):
    a = np.append(a, i)

5
@NicholasTJ:empty((0))numpy配列を初期化します。
Adobe

2
np.empty((0))の括弧は冗長です。
Szymon Roziewski、2018

7

numpy.fromiter() あなたが探しているものです:

big_array = numpy.fromiter(xrange(5), dtype="int")

ジェネレーター式でも機能します。例:

big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )

事前に配列の長さがわかっている場合は、オプションの 'count'引数で指定できます。


2
私は実際にtimeitを実行しましたが、np.fromiter()はnp.array()よりも遅いと思います。timeit( "np.array(i for i in xrange(100))"、setup = "import numpy as np"、number = 10000)-> 0.02539992332458496対timeit( "np.fromiter((i for i in xrange( 100))、dtype = int) "、setup =" import numpy as np "、number = 10000)-> 0.13351011276245117
hlin117

6

アレイコンピューティングを実行するときは、明示的なループをできるだけ回避する必要があります。これは、その形式のコンピューティングによる速度の向上を低下させるためです。numpy配列を初期化する方法は複数あります。ゼロで埋めたい場合は、katrielalexが言ったようにします。

big_array = numpy.zeros((10,4))

編集:どのようなシーケンスで作成していますか?numpy.linspace(start, stop, size)(等間隔の数)やのような配列を作成するさまざまなnumpy関数をチェックする必要がありますnumpy.arange(start, stop, inc)。可能な場合、これらの関数は、明示的なループで同じ作業を行うよりも配列を大幅に高速化します


5

最初の配列の例として、

a = numpy.arange(5)

big_arrayを初期化するには、

big_array = numpy.zeros((10,4))

これはゼロで初期化することを想定していますが、これはかなり一般的ですが、numpyで配列を初期化する方法は他にもたくさんあります

編集: big_arrayのサイズが事前にわからない場合は、通常、最初に追加を使用してPythonリストを作成し、リストにすべてを収集したら、を使用してこのリストをnumpy配列に変換することをお勧めしますnumpy.array(mylist)。この理由は、リストは非常に効率的かつ迅速に拡大することを目的としているのに対し、numpy配列はサイズを簡単に変更できないため、numpy.concatenateは非常に非効率的です。しかし、すべてがリストに収集され、最終的な配列サイズがわかったら、numpy配列を効率的に構築できます。


5

numpy配列を特定の行列で初期化するには:

import numpy as np

mat = np.array([[1, 1, 0, 0, 0],
                [0, 1, 0, 0, 1],
                [1, 0, 0, 1, 1],
                [0, 0, 0, 0, 0],
                [1, 0, 1, 0, 1]])

print mat.shape
print mat

出力:

(5, 5)
[[1 1 0 0 0]
 [0 1 0 0 1]
 [1 0 0 1 1]
 [0 0 0 0 0]
 [1 0 1 0 1]]

3

次の状況にあるときはいつでも:

a = []
for i in range(5):
    a.append(i)

そして、あなたはnumpyで同様のものを望んでいます、以前のいくつかの答えはそれを行う方法を指摘しましたが、@ katrielalexが指摘したように、これらの方法は効率的ではありません。これを行うための効率的な方法は、長いリストを作成し、長いリストを作成した後、それを希望どおりに再形成することです。たとえば、ファイルからいくつかの行を読み込んでいて、各行に数値のリストがあり、形の数の多い配列(読み込んだ行の数、各行のベクトルの長さ)を構築するとします。これが私がより効率的に行う方法です:

long_list = []
counter = 0
with open('filename', 'r') as f:
    for row in f:
        row_list = row.split()
        long_list.extend(row_list)
        counter++
#  now we have a long list and we are ready to reshape
result = np.array(long_list).reshape(counter, len(row_list)) #  desired numpy array

2

私はこれが少し遅れていることを理解していますが、空の配列へのインデックス付けについて言及している他の回答には気付きませんでした:

big_array = numpy.empty(10, 4)
for i in range(5):
    array_i = numpy.random.random(2, 4)
    big_array[2 * i:2 * (i + 1), :] = array_i

このようにして、結果の配列全体を事前に割り当て、numpy.emptyインデックス付きの割り当てを使用して行を埋めていきます。

配列全体が生成したチャンクで満たされることが保証されているためempty、指定zerosした例の代わりにで事前に割り当てることは完全に安全です。


2

最初に形状を定義することをお勧めします。次に、それを反復して値を挿入します。

big_array= np.zeros(shape = ( 6, 2 ))
for it in range(6):
    big_array[it] = (it,it) # For example

>>>big_array

array([[ 0.,  0.],
       [ 1.,  1.],
       [ 2.,  2.],
       [ 3.,  3.],
       [ 4.,  4.],
       [ 5.,  5.]])

1

多分このようなものはあなたのニーズに合うでしょう。

import numpy as np

N = 5
res = []

for i in range(N):
    res.append(np.cumsum(np.ones(shape=(2,4))))

res = np.array(res).reshape((10, 4))
print(res)

次の出力を生成します

[[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.