Есть ли что-то вроде «заполнителя» как элемента в массивах в numpy? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть определенный numpy 1d - массив с фиксированным количеством элементов, с которыми я выполняю некоторые математические операции. Когда один из элементов становится равным нулю, я хочу удалить его, но вместо уменьшения размера 1d-массива мне нужно временно заполнить заполнителем. Под заполнителем я подразумеваю нечто, что в будущем будет определять, что следующий элемент будет помещен в эту указанную c позицию, а не в конец массива.

В частности, я сейчас делаю следующее:

delete_ind = np.where(element == 0)[0]
array = np.delete(array, delete_ind)

...

array = np.append(array, new_element)

Но это смещает значения влево, в то время как я хочу заполнить delete_ind пробелом, а затем go назад и поместить в пустую позицию новый_элемент.

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Вы можете использовать np.where, чтобы найти индексы, которые вы хотите заменить. Затем, как только вы вычислили новые значения для вставки (предполагая, что они зависят от индекса), вы можете снова использовать np.where для их вставки

#find the indices we want to replace
fill_inds = np.where(a == 0)

#build an array with the values to be inserted into a
fill_values = np.zeros(a.shape)
fill_values[fill_inds] = 100 #this could be some function of the index if you like

#replace the values we want to replace
a = np.where(a == 0, fill_values, a)

Если fill_values ​​является константой, вы можете использовать np.where непосредственно. Если вы хотите что-то сделать с перед тем, как вставить новые значения, вы можете использовать маскированный массив

mask = a == 0 #Array of true/false values
masked_a = np.ma.masked_array(a, mask)

# do stuff to a, without touching the masked values

filled_a = masked_a.filled(fill_value = 'some value')

Надеюсь, это поможет:)

0 голосов
/ 06 апреля 2020

Эта концепция для пустого слота является общей для файловых систем или выделения памяти. Обычно используется список свободных блоков с их размером. Здесь, поскольку вы хотите обрабатывать отдельные элементы, я бы использовал стек для хранения этих пустых блоков. Стек может быть реализован тривиально с массивом numpy с его текущими и максимальными размерами.

0 голосов
/ 06 апреля 2020
delete_ind = np.where(element == 0)[0]
array = np.delete(array, delete_ind)

вместо этого вы можете сделать это

array[delete_ind]=NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...