Вставка мини-массива в больший массив с интервалами (без изменения размера) - PullRequest
2 голосов
/ 13 июня 2019

Я пытаюсь вставить мини-массив в больший массив без изменения размера, поэтому меняю значения большего массива с помощью мини-массива.

Есть мини-массив, х х.У большего массива, X X Каждые элементы Y, замените следующие элементы на значения мини-массива.До самого конца.

Я пытался сделать это с помощью индексации (код можно найти ниже).

mesh_array = np.zeros(shape=(100,100), dtype=np.uint8) 
mini_square = np.ones(shape=(2,2), dtype=np.uint8) 

flattened_array = np.ravel(mesh_array) 
flattened_minisquare = np.ravel(mini_square) 

flattened_array[1:-1:10] = flattened_minisquare

Ожидаемый результат состоит в том, что каждые 10 элементов, он будет заменятьследующие со значениями flatered_minisquare.

[0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0...]

Сообщение об ошибке, которое я получаю:

"ValueError: could not broadcast input array from shape (4) into shape (1000)"

1 Ответ

0 голосов
/ 13 июня 2019

Могут быть и более эффективные способы, но один из подходов состоит в следующем:

import numpy as np

mesh_array = np.zeros(shape=(100,100), dtype=np.uint8) 
mini_square = np.ones(shape=(2,2), dtype=np.uint8) 

flattened_array = np.ravel(mesh_array) 
flattened_minisquare = np.ravel(mini_square)

Теперь мы можем построить массив, который будет соответствовать позициям, в которых вы хотите заполнить minisquareс остальными значениями в виде нулей.Обратите внимание, что, если заданный вывод верен, это будет массив длины 13 в этом случае.9 элементов исходного массива + 4 из мини-квадрата

stepsize = 10
temp = np.zeros(stepsize + len(flattened_minisquare) - 1)
temp[-len(flattened_minisquare):] = flattened_minisquare

Мы также создаем маску для значений, которые не заполнены мини-квадратом.

mask = np.copy(temp)
mask[-len(flattened_minisquare):] = np.ones_like(flattened_minisquare)
mask = ~mask.astype(bool)

Теперь просто используйте np.resize чтобы расширить и маску, и временный массив, а затем, наконец, использовать маску для заполнения значений из старого массива.

out = np.resize(temp, len(flattened_array))
final_mask = np.resize(mask, len(flattened_array))
out[final_mask] = flattened_array[final_mask]

print(out)
#[0. 0. 0. ... 0. 0. 0.]
...