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

2 に答える 2

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()]]
于 2012-05-07T16:59:34.853 に答える
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)

複雑なオブジェクトをnumpy配列に配置すると、はにdtypeなりobjectます。通常のnumpy配列の場合と同じように、配列のメンバーとスライスにアクセスできます。私はシリアル化に精通していませんが、その領域で欠点が発生する可能性があります。

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

 std_list = ['this is a string', 0, {'field' : 'attribute'}]
 std_list[2:]
于 2012-05-07T16:54:32.783 に答える