2012-05-07 8 views
1

NumPyでは、インデックスの範囲のワイルドカードとして:を使用して配列の全セグメントを割り当てることができます。たとえば:範囲の割り当てが必要な配列タイプ

>>> (n, m) = (5,5) 
>>> a = numpy.array([[0 for i in range(m)] for j in range(n)]) 
>>> a 
array([[0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0]]) 

>>> for i in range(n): 
...  a[i, :] = [1 for j in range(m)] 
>>> a 
array([[1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1]]) 

しかし、numpy.arrayは、数値データのみを保持しています。私は任意のオブジェクトを保持することができ、NumPy配列のように扱うことができる配列型が必要です。私は何を使うべきですか?

編集:私はこの範囲割り当て構文の完全な柔軟性を望んでいます。これは、あまりにも、動作するはずです:

>>> a[:,1] = 42 
>>> a 
array([[ 1, 42, 1, 1, 1], 
     [ 1, 42, 1, 1, 1], 
     [ 1, 42, 1, 1, 1], 
     [ 1, 42, 1, 1, 1], 
     [ 1, 42, 1, 1, 1]]) 
+1

はあなたがその特定のケースを必要とする、またはこのsufficentような単純な例ですか?その場合、組み込みリストはうまく動作しますが、カンマを省略するだけです。 – delnan

+0

@delnanどちらもありません。より複雑な場合にもこの構文を使用したいと思います。 – clstaudt

答えて

1

は、たぶん私はここに何かが欠けているが、numpyのは事実ホールドオブジェクトだけでなく、数字でありません。

In [1]: import numpy 

In [2]: complex = {'field' : 'attribute'} 

In [3]: class ReallyComplex(dict): 
    ...:  pass 
    ...: 

In [4]: a = numpy.array([complex,ReallyComplex(),0,'this is a string']) 

In [5]: a 
Out[5]: array([{'field': 'attribute'}, {}, 0, this is a string], dtype=object) 
In [6]: subsection = a[2:] 

In [7]: subsection 
Out[7]: array([0, this is a string], dtype=object) 

あなたはdtypeobjectなりnumpyの配列に複雑なオブジェクトを配置します。配列のメンバーとスライスには、通常のnumpy配列と同様にアクセスできます。私はシリアライゼーションに慣れていないが、その領域には欠点があるかもしれない。

numpysが標準のPythonリストに行く方法ではないと確信しているのであれば、オブジェクトのコレクションを維持するための素晴らしい方法であり、numpy配列と非常によく似たpythonリストをスライスすることもできます。

std_list = ['this is a string', 0, {'field' : 'attribute'}] 
std_list[2:] 
+0

「numpyは実際には数字だけでなくオブジェクトも保持しています。 私が試したので、私は、それを認識していなかった。 を>>> [0,0]なし トレースバック(最新の呼び出しの最後)=: TypeError例外で ファイル ""、行1、:int型( )引数は 'NoneType'ではなく文字列または数字でなければなりません 私の問題を解決すると思います。 – clstaudt

+0

うれしい私は助けることができました! – lukecampbell

1

numpyのは、何が必要行わない場合は、標準のPythonのリストになります。

>>> (n, m) = (5,5) 
>>> 
>>> class Something: 
...  def __repr__(self): 
...   return("Something()") 
... 
>>> class SomethingElse: 
...  def __repr__(self): 
...   return("SomethingElse()") 
... 
>>> a = [[Something() for i in range(m)] for j in range(n)] 
>>> 
>>> for i in range(n): 
...  a[i] = [SomethingElse() for j in range(m)] #Use a[i][:] if you want to modify the sublist, not replace it. 
... 
>>> a 
[[SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse()], 
[SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse()], 
[SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse()], 
[SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse()], 
[SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse(), SomethingElse()]] 
関連する問題