nparrays_list = [
array([1, 2, 3, 4])
array([5, 6, 7, 8]),
array([9, 10, 11, 12])
]
Keine Sorge darum, neue Listen. Listen enthalten nur Zeiger auf Objekte im Speicher. In diesem Fall belegt die Liste nur den Speicher von 3 ganzen Zahlen. Die Komponenten belegen Speicher - sie sind Arrays mit 4 Element-Datenpuffern.
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')])
]
ist eine andere kleine Liste, mit 3 Zeigern. Sie könnten diese Zeiger wieder auf das Original nparray_list
setzen, aber warum? Nur um 3 ganzen Platz zu sparen?
Aber was bedeutsam ist, dass die neuen Arrays nicht kompatibel sind, Speicher klug, mit den Originalen:
array([Decimal('1'), Decimal('2'), Decimal('3'), Decimal('4')])
ein Objekt dtype Array ist. Das ist wie eine Liste, mit Zeigern auf diese Decimal(n')
Objekte wo sonst im Speicher. Das muss ein neues Array sein; es kann die np.int32
Einzelteile im ursprünglichen array([1,2,3,4])
nicht ersetzen.
Warum gehst du nicht einfach aus
nparrays_list = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
zu:
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')]
]
Mit anderen Worten, Stick mit Listen von Listen. Ist ein Array von Decimal
Objekten nützlicher als eine Liste derselben?
===============
Decimal
Da viele mathematische Operationen definiert, es ist möglich, einige mathematische Array auf einer Anordnung von Objekten Decimal
auszuführen:
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)
speedwise diese letzte Aussage ist grundsätzlich das gleiche wie:
np.array([1/i for i in arr])
Es langsamer als 1/np.arange(1,4)
sein wird.
====================
Sie könnten ein wenig Verbesserung der Geschwindigkeit erhalten, indem die Dezimal-Array machen mit:
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)
In andere Tests habe ich gefunden, dass frompyfunc
eine bescheidene (zB 2x) Geschwindigkeit Verbesserung gegenüber expliziter Iteration Ausdrücke hat. Es hat auch den Vorteil, nahtlos mit mehrdimensionalen Arrays umzugehen. Es gibt ein Array object
zurück. Manchmal ist das ein Problem. Hier ist das in Ordnung.
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
Ich fragte mich, warum Sie str(i)
verwendet. Aber dann habe ich festgestellt, dass Decimal
nur ein paar der np.dtypes
(nicht np.int32
) nehmen kann. Meine Vermutung ist, das frompyfunc
verwendet item()
oder das Äquivalent Python Skalare zu produzieren:
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
muss das Äquivalent von i.item()
tun ein Python-Skalar vom np.int32
Objekt zu erzeugen.
Wie haben Sie das 'D' definiert? Und warum 'nparrays_list' ist kein numpy Array? – Kasramvd
Ich denke, Sie könnten zumindest die temporäre Liste speichern, indem Sie ein "
'D' steht für Dezimal. Lass mich das bearbeiten, um es klarer zu machen. Und es ist 'nparrays_list', weil es eine Liste von numpy Arrays ist. Ich brauche den Container auch nicht, um ein Nparray zu sein –