397

通常リストを使用する方法で配列または行列を使用する方法がわかりません。空の配列 (または行列) を作成し、一度に 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配列または行列にそのような表記法を使用する方法はありますか?

4

15 に答える 15

532

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.]])
于 2009-02-20T10:36:46.047 に答える
123

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

例えば


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

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


mat = numpy.array(data)

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

編集:

何らかの理由で本当に空の配列を作成したい場合は、を使用できますが numpy.array([])、これが役立つことはめったにありません。

于 2009-02-20T10:44:19.947 に答える
10

追記機能が使えます。行の場合:

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

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

于 2009-02-20T10:27:31.797 に答える
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
于 2011-09-06T21:20:44.693 に答える
3

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

a = range(5)
a = [i*0 for i in a]
print a 
[0, 0, 0, 0, 0]
于 2015-10-01T17:50:36.103 に答える
2

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

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

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

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

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

于 2016-09-11T00:28:42.980 に答える