web-dev-qa-db-ja.com

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

通常リストを使うような方法で配列や行列を使う方法を理解することはできません。空の配列(または行列)を作成してから、一度に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 の配列や行列に使う方法はありますか?

251
Ben

あなたは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.]])
358
Stephen Simmons

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([])を使用できますが、これはほとんど役に立ちません。

80
Greg Ball

NumPyで空の多次元配列(行列を格納するための2D配列m*n)を作成するには、mを追加する行数がわからず、計算コストについては気にしないでください。追加するたびに配列を作成して、追加するディメンションを0に絞り込むことができます(X = np.empty(shape=[0, n]))。

このようにあなたは例えば使用することができます(ここで我々は空行列を作成するとき知らなかったと仮定するここでm = 5n = 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.]]
38

私は私の学校のプロジェクトのセットとして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)

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

22
Andrei Paga

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

>>> 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]])

_編集_
もちろん、他の回答で述べたように、行列/配列に対して何らかの処理(反転など)を行わない限り、何かを追加するたびに、リストを作成してから追加します。それを配列に変換します。

6
Il-Bhima

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

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
cyborg

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

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

これを使用している目的によっては、データ型を指定する必要があるかもしれません( 'dtype' を参照)。

たとえば、8ビット値の2次元配列を作成するには(白黒画像としての使用に適しています)。

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

RGB画像の場合は、形状にカラーチャンネルの数を含めます。shape=(H,W,3)

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

1
nobar

私はあなたがリストを使った作業の大部分を処理してから結果を行列として使いたいと思うと思います。たぶんこれは方法です。

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

mat = np.matrix(ur_list)
0
runo

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

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

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

0
veeresh d