Заполните новые значения в массиве фиксированной формы numpy, заполненном нулями - PullRequest
1 голос
/ 18 февраля 2020

Учитывая, что массив numpy хранится непрерывно, если мы попытаемся append или extend к нему, тогда это произойдет не на месте , а вместо этого новая копия массива создается с достаточным «пространством» для непрерывного появления append или extend (см. { ссылка }).

Чтобы избежать этого , и, если нам посчастливится узнать определенное количество c элементов, которые мы ожидаем получить в массиве, мы можем создать массив numpy с фиксированным размером , заполненным нулями :

import numpy as np

a = np.zeros(shape=(100,))  # [0. 0. 0. ... 0. 0. 0.]

Скажем, что мы хотим каждый раз заполнять этот массив каждым элементом новым значением (например, предоставленным пользователем), редактируя этот массив на месте :

pos = 0
a[pos] = 0.002              # [0.002 0. 0. ... 0. 0. 0.]

pos = pos + 1
a[pos] = 0.101              # [0.002 0.101 0. ... 0. 0. 0.]

# etc.

pos = -1
a[pos] = 42.00              # [0.002 0.101 ... ... ... 42.]

Вопрос:

Есть ли способ отслеживать следующую доступную позицию pos (т.е. последнюю позицию, ранее не заполненную новым входным значением) вместо ручного увеличения pos каждый раз?

Есть ли способ эффективного достижения этого в numpy, предпочтительно? Или есть способ добиться этого в другой Python библиотеке (например, scipy или Pandas)?

(отредактировал вопрос в соответствии с комментариями и первоначальными ответами, в которых было указано, как непонятно мое первоначальный вопрос был сформулирован - надеюсь, теперь это стало понятнее)

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

На самом деле, ваш вопрос все еще сбивает меня с толку. Как вы определяете новое значение, которое вы хотите вставить в новую позицию? Это происходит снаружи вашего кода? У вас есть все новые значения для вашего массива или только его часть?

Возможно, вы можете использовать срезы в numpy, которые предназначены именно для быстрого обновления массива, однако я не совсем уверен, что это то, что вы хотите сделать.

Некоторые образцы для вас:

>>> import numpy as np
>>> a = np.zeros(shape=(10,))
>>> a
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> a[3:6] += 1
>>> a
array([0., 0., 0., 1., 1., 1., 0., 0., 0., 0.])
>>> a[:4] += .001
>>> a
array([1.000e-03, 1.000e-03, 1.000e-03, 1.001e+00, 1.000e+00, 1.000e+00,
       0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00])
>>> a[3:5] = [2, 1]
>>> a
array([1.e-03, 1.e-03, 1.e-03, 2.e+00, 1.e+00, 1.e+00, 0.e+00, 0.e+00,
       0.e+00, 0.e+00])
>>>
0 голосов
/ 18 февраля 2020

Если я вас правильно понимаю, вам нужен какой-то кольцевой буфер. Python имеет collection.deque для этой цели.

Здесь - моя пользовательская реализация кольцевого буфера с использованием h5py, но вы можете изменить его на numpy.

Обновление: Как уже упоминалось в комментариях, невозможно отслеживать изменения np.array из коробки. Вместо этого вы можете реализовать свой собственный класс и отслеживать там все необходимые изменения (см., Например, мою реализацию , то есть объединение массивов для увеличения его размера). Я бы предложил вам использовать python list, если вам нужно добавить, или deque, если вам нужен фиксированный размер. Оба массива могут быть преобразованы в np.array

...