nparrays_list = [
array([1, 2, 3, 4])
array([5, 6, 7, 8]),
array([9, 10, 11, 12])
]
ことについて心配しないでください新しいリスト。リストには、メモリ内の他の場所にあるオブジェクトへのポインタが含まれています。この場合、リストは3つの整数のメモリしか占有しません。これらのコンポーネントはメモリを占有します。これらは4要素のデータバッファを持つ配列です。
nparrays_list_Decimal = [
array([Decimal('1'), Decimal('2'), Decimal('3'), Decimal('4')]),
array([Decimal('5'), Decimal('6'), Decimal('7'), Decimal('8')]),
array([Decimal('9'), Decimal('10'), Decimal('11'), Decimal('12')])
]
は、3つのポインタを持つ別の小さなリストです。それらのポインタを元のnparray_list
に戻すことができますが、なぜですか? 3つの整数分のスペースを節約するだけですか?
しかし、どのような重要なのですが、新しい配列がオリジナルで、互換性、メモリ賢明ではないということです。
array([Decimal('1'), Decimal('2'), Decimal('3'), Decimal('4')])
は、オブジェクトDTYPE配列です。これはリストのようなもので、メモリ内のどこか他のオブジェクトであるDecimal(n')
オブジェクトへのポインタです。それは新しい配列でなければなりません。元のarray([1,2,3,4])
のnp.int32
アイテムを置き換えることはできません。換言すれば、
nparrays_list_Decimal = [
[Decimal('1'), Decimal('2'), Decimal('3'), Decimal('4')],
[Decimal('5'), Decimal('6'), Decimal('7'), Decimal('8')],
[Decimal('9'), Decimal('10'), Decimal('11'), Decimal('12')]
]
リストのリストに固執:
は、なぜあなたはちょうど
nparrays_list = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
からに行っていません。 Decimal
オブジェクトの配列は、同じもののリストよりも便利ですか?
===============
Decimal
は、多くの数学演算を規定するので、Decimal
オブジェクトの配列にいくつかの配列演算を行うことが可能である:
In [482]: arr = np.array([Decimal(i) for i in range(1,4)])
In [483]: arr
Out[483]: array([Decimal('1'), Decimal('2'), Decimal('3')], dtype=object)
In [484]: arr + 1
Out[484]: array([Decimal('2'), Decimal('3'), Decimal('4')], dtype=object)
In [485]: 1/arr
Out[485]:
array([Decimal('1'), Decimal('0.5'),
Decimal('0.3333333333333333333333333333')], dtype=object)
それは
1/np.arange(1,4)
よりも遅くなります
np.array([1/i for i in arr])
:この最後の文Speedwise
は基本的に同じです。
====================
あなたは10進配列を作ることによって少し速度向上を得る可能性があります:
In [503]: np.frompyfunc(Decimal,1,1)(np.arange(3))
Out[503]: array([Decimal('0'), Decimal('1'), Decimal('2')], dtype=object)
In [504]: np.frompyfunc(Decimal,1,1)(np.arange(12).reshape(3,4))
Out[504]:
array([[Decimal('0'), Decimal('1'), Decimal('2'), Decimal('3')],
[Decimal('4'), Decimal('5'), Decimal('6'), Decimal('7')],
[Decimal('8'), Decimal('9'), Decimal('10'), Decimal('11')]], dtype=object)
で他のテスト私はfrompyfunc
が明示的な反復式よりも適度な(例えば2倍の)速度向上を持つことを発見しました。また、多次元配列をシームレスに処理できるという利点もあります。配列object
を返します。時にはそれは問題です。ここでそれはちょうどいいです。
In [509]: timeit np.frompyfunc(Decimal,1,1)(np.arange(2000))
1000 loops, best of 3: 752 µs per loop
In [510]: timeit np.array([Decimal(str(i)) for i in np.arange(2000)])
100 loops, best of 3: 17.1 ms per loop
In [515]: timeit np.array([Decimal(i) for i in range(2000)])
100 loops, best of 3: 7.39 ms per loop
In [525]: timeit np.array([Decimal(i.item()) for i in np.arange(2000)])
100 loops, best of 3: 11.3 ms per loop
私はなぜstr(i)
を使用したのだろうと思いました。しかし、その後私はDecimal
がnp.dtypes
(np.int32
ではない)のうちのいくつかしか取ることができないことが分かった。私の推測では、frompyfunc
はPythonのスカラーを生成するためにitem()
または同等のものを使用している:
In [523]: np.frompyfunc(Decimal,1,1)(np.arange(2))
Out[523]: array([Decimal('0'), Decimal('1')], dtype=object)
In [524]: np.array([Decimal(i.item()) for i in np.arange(2)])
Out[524]: array([Decimal('0'), Decimal('1')], dtype=object)
frompyfunc
がnp.int32
オブジェクトからPythonのスカラーを生成するi.item()
と同等のものをやっている必要があります。
'D 'をどのように定義しましたか?そしてなぜ 'nparrays_list'がnumpy配列ではないのですか? – Kasramvd
私はあなたが少なくとも "U8"形式とジェネレータを渡すことで一時的なリストを保存できると思います。それはあなたの項目を8文字に切り詰めるでしょう。 –
'D'はDecimalを表します。より明確にするためにそれを編集しましょう。 numpl配列のリストなので、 'nparrays_list'です。コンテナをnparrayにする必要はありません –