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')
объектов, где в памяти. Это должен быть новый массив; он не может заменить np.int32
предметов в оригинале array([1,2,3,4])
.
Почему вы не просто идти от
nparrays_list = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
к:
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')]
]
Другими словами, придерживаться списков списков. Является ли массив объектов 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)
По скорости последнего утверждения в основном так же, как:
np.array([1/i for i in arr])
это будет медленнее, чем 1/np.arange(1,4)
.
====================
Вы можете получить небольшое улучшение скорости, делая десятичного массив с:
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
имеет более скромное (например, 2x) улучшение скорости по сравнению с более явными итерационными выражениями. Это также имеет то преимущество, что позволяет легко обрабатывать многомерные массивы. Он возвращает массив 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
использует item()
или эквивалент для получения скаляров Python:
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
должен делать эквивалент i.item()
для создания Python скаляра из np.int32
объекта.
Как вы определили 'D'? И почему 'nparrays_list' не является массивом numpy? – Kasramvd
Я думаю, вы могли бы хотя бы сохранить временный список, передав формат ''
'D' означает Decimal. Позвольте мне изменить это, чтобы сделать его более понятным. И это 'nparrays_list', потому что это список массивов numpy. Я не нуждаюсь в контейнере, чтобы быть nparray, а также –