NumPyで空の配列/行列を作成するにはどうすればよいですか?


311

通常はリストを使用する方法で配列または行列を使用する方法がわかりません。空の配列(または行列)を作成し、一度に1つの列(または行)を追加します。

現時点では、これを行うために見つけることができる唯一の方法は次のとおりです。

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

それがリストであったとしても、私はこのようなことをします:

list = []
for item in data:
    list.append(item)

NumPy配列または行列にそのような表記を使用する方法はありますか?

回答:


441

NumPyを効率的に使用するための間違ったメンタルモデルがあります。NumPy配列は、メモリの連続したブロックに格納されます。行または列を既存の配列に追加する場合は、配列全体を新しいメモリブロックにコピーする必要があり、新しい要素を格納するためのギャップが作成されます。配列を構築するために繰り返し行われる場合、これは非常に非効率的です。

行を追加する場合、最善の策は、最終的にデータセットと同じ大きさの配列を作成し、行ごとにデータを追加することです。

>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1.,  2.],
   [ 2.,  3.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])

123
配列をゼロにする必要がない場合は、numpy.empty()もあります。
janneb 2009

21
zeros()よりもempty()を使用する利点は何ですか?
ザック

45
データですぐに初期化する場合は、ゼロ化のコストを節約できます。
marcorossi

16
@maracorossi .empty()は、セル内でランダムな値を見つけることができることを意味しますが、配列はたとえば.zeros()
user3085931 2016

6
@ user3085931うん!
Nathan

98

NumPy配列は、リストとは非常に異なるデータ構造であり、さまざまな方法で使用するように設計されています。の使用hstackは潜在的に非常に非効率的です...呼び出すたびに、既存の配列のすべてのデータが新しい配列にコピーされます。(append関数にも同じ問題があります。)一度に1列ずつマトリックスを作成する場合は、完了するまでリストに保持し、それを配列に変換することをお勧めします。

例えば


mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

itemそれぞれitemが同じ数の要素を持っている限り、リスト、配列、または任意の反復可能にすることができます。
この特定のケースでは(data行列の列を保持するいくつかの反復可能です)、単純に使用できます


mat = numpy.array(data)

(またlist、組み込み型をその名前でマスクするため、変数名として使用することはおそらく良い習慣ではないことに注意してください。バグが発生する可能性があります。)

編集:

なんらかの理由で本当に空の配列を作成したい場合は、を使用できますが numpy.array([])、これはほとんど役に立ちません!


1
numpy配列/行列はMatlabのものと根本的に異なりますか?
レベスク2010

1
何らかの理由で空の配列を定義する必要があるが、幅が固定されている場合(例:)np.concatenate()、次を使用できますnp.empty((0, some_width))。0なので、最初の配列はゴミになりません。
NumesSanguis 2017

56

numpyの中で(例えばA 2次元配列の空の多次元配列を作成するm*n場合には、あなたが知らない、あなたの行列を格納するために)mあなたが追加されますどのように多くの行とスティーブン・シモンズは述べた計算コストを気にしない(つまり再buildinging各APPEND)の配列は、あなたが0にあなたが追加したいと次元を絞ることができますX = np.empty(shape=[0, n])

このようにして、たとえば次のように使用できます(ここm = 5では、空の行列を作成するときに知らなかったと仮定していますn = 2)。

import numpy as np

n = 2
X = np.empty(shape=[0, n])

for i in range(5):
    for j  in range(2):
        X = np.append(X, [[i, j]], axis=0)

print X

あなたに与えるでしょう:

[[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]
 [ 2.  0.]
 [ 2.  1.]
 [ 3.  0.]
 [ 3.  1.]
 [ 4.  0.]
 [ 4.  1.]]

1
これは、事前に#rowsがわからない、または0行がある場合の処理​​に対応したい場合のOPの質問に対する答えである必要があります
Spcogg、2

26

私は学校のプロジェクトの1つでnumpy.arrayをセットとして使用する必要があり、空に初期化する必要があったので、これをよく調べました...ここでスタックオーバーフローに関連する答えが見つからなかったので、始めましただらだら。

# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

結果は次のようになります。

In [34]: x
Out[34]: array([], dtype=float64)

したがって、次のようにnp配列を直接初期化できます。

In [36]: x= np.array([], dtype=np.float64)

これがお役に立てば幸いです。


これは、質問のように配列では機能しませんが、ベクトルには役立ちます。
divenex '12

a=np.array([])デフォルトのようですfloat64
I P

7

追加機能を使用できます。行の場合:

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])

列の場合:

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])

編集
もちろん、他の回答で述べたように、何かを追加するたびにマトリックス/アレイで何らかの処理(例:反転)を行わない限り、リストを作成して追加し、それをアレイ。


3

配列の最終的なサイズが絶対にわからない場合は、次のように配列のサイズを増やすことができます。

my_arr = numpy.zeros((0,5))
for i in range(3):
    my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)

[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • 0最初の行に注意してください。
  • numpy.append別のオプションです。と呼びますnumpy.concatenate

3

これを適用して、ゼロのようなあらゆる種類の配列を構築できます。

a = range(5)
a = [i*0 for i in a]
print a 
[0, 0, 0, 0, 0]

4
純粋なpythonでそれを行いたい場合a= [0] * 5は、簡単な解決策です
Makers_F

3

numpyをリストのように見せるためのいくつかの回避策があります

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)

出力:array([2.、24.])


2

これを何に使用するかに応じて、データ型を指定する必要がある場合があります('dtype'を参照)。

たとえば、8ビット値の2D配列を作成するには(モノクロ画像としての使用に適しています):

myarray = numpy.empty(shape=(H,W),dtype='u1')

RGBイメージの場合、シェイプにカラーチャネルの数を含めます。 shape=(H,W,3)

numpy.zerosを使用する代わりに、ゼロで初期化することを検討することもできnumpy.emptyます。注を参照してくださいここに


1

リストでの作業のほとんどを処理し、その結果をマトリックスとして使用したいと思います。多分これは方法です。

ur_list = []
for col in columns:
    ur_list.append(list(col))

mat = np.matrix(ur_list)

1

私はあなたが次のような空のnumpy配列を作成できると思います:

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

この形式は、ループにnumpy配列を追加する場合に役立ちます。


0

形状を定義せずに空のNumPy配列を作成するには、次の方法があります。

1。

arr = np.array([]) 

優先。これをnumpyとして使用することを知っているからです。

2。

arr = []
# and use it as numpy. append to it or etc..

NumPyは、これを後で余分ななしでnp.ndarrayタイプに変換し[] dimionsionます。


0

おそらくあなたが探しているのは次のようなものです:

x=np.array(0)

このようにして、要素のない配列を作成できます。それは以下と似ています:

x=[]

これにより、事前に新しい要素を配列に追加することができます。

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