У меня есть двумерный массив numpy: myarray=[[0,0],[1,1],[2,2]]
Еще у меня есть сетка точек: mygrid=[[70,70],[100,100],[30,30]]
Я хочу эффективно создать новый массив, содержащий точки myarrray
, добавленные в сетку:
desired_result=[[70,70],[71,71],[72,72],[100,100],[101,101],[102,102],[30,30],[31,31],[32,32]]
Можно представить себе размещение 1x3
пиксельного блока на позициях сетки. Если я работаю с матрицей, состоящей из np.ones(dimensions)
, замена единиц на нули вместо desired_result
создает сетку из 1x3
блоков пикселей.
Можно использовать координаты, описывающие круг/геометрическую фигуру в месте myarray
, что затем создаст сетку из кругов/геометрических фигур.
Я не понимаю, в чем проблема.
Должен добавить, что, как и другие, я не вижу связи между преамбулой (кругом) и вопросом. Я все равно ответил (хотя обычно я не отвечаю на вопрос, пока он не будет полностью разъяснен), потому что единственный реальный вопрос здесь - это тот, на который я тоже ответил (остальные кажутся неуместными и непонятными, если честно, элементы контекста). Вам следует удалить ненужные элементы контекста, то есть удалить ссылки на круги.
Разве здесь еще и вопрос про круги? В этом случае будет два разных вопроса (поскольку тот, на который я ответил, является независимым). В таком случае, если у вас есть 2 вопроса (один про круги, другой про добавление точек в сетку), вам следует задать их в 2 отдельных постах (и уточнить вопрос про круг, потому что он действительно не понятен. Могу только предполагать). речь идет о том, "как заполнить экран кругами, центры которых находятся на карте", но вы этого не сказали)
@chrslg Я думаю, что в предполагаемом приложении myarray
состоит из точек, образующих круг, а mygrid
— это «черный холст», а желаемый результат — это сетка из кругов. Я не вижу другого способа осмыслить ответ. Хороший ответ, кстати (+1)
@JohnColeman действительно может быть. Моя гипотеза заключалась в том, что myarray
— это список центров (например, «карта» в первой части), а mygrid
— это пример круга (то же самое, что myarray
в вашей гипотезе). Итак, result=myarray[None,...]+mygrid[:,None,:]
— это список координат всех точек всех окружностей, центры которых являются одним из myarray
. А затем оставшимся этапом было бы использовать это как индекс для «рисования» screen
. screen[(xy[:,1], xy[:,0])]=0
например.
Я должен сказать, что вы, ребята, очень умны, что догадались, когда мой вопрос сформулирован так хахахахахахахаха
На последнюю часть вопроса ответ однозначен. Для этого и существует вещание
myarray=[[0,0],[1,1],[2,2]]
mygrid=[[70,70],[100,100],[30,30]]
result = (np.array(myarray)[None,:,:] + np.array(mygrid)[:,None,:]).reshape(-1,2)
Некоторые пояснения:
A=np.array(myarray)[None,:,:]
— это [[[0,0],[1,1],[2,2]]]
, то есть трёхмерный массив, первое измерение которого имеет только 1 элемент (сам myarray). Итак, массив 1×3×2, например A[0,i,j]
= myarray[i,j]
B=np.array(mygrid)[:,None,:]
равно [[[70,70]],[[100,100]],[[30,30]]]
, то есть трехмерный массив, второе измерение которого каждый раз содержит только 1 элемент. Итак, массив 3×1×2, например B[i,0,j]
= mygrid[i,j]
.
А из-за широковещательной передачи добавление массива X размера 1 к массиву Y размера n добавляет элемент в каждый из n элементов Y (array([12]) + array([10,20,30])
— это array([22,32,42])
), и для каждой оси результатом A+B
является 3× Массив 3×2, элемент (A+B)[i,j,k]
которого равен A[0,j,k]+B[i,0,k]
= myarray[j,k]+mygrid[i,k]
. Итак, что вы хотите, или почти так.
Вы хотите, чтобы они располагались последовательно, то есть массивом 9×2. Это достигается путем преобразования результата в форму 9×2 (я использовал фигуру -1×2, поскольку мне разрешено заменять один из размеров на -1, который затем вычисляется автоматически. Итак, я слишком ленив, чтобы вычислить общий размер, len(mygrid)*len(myarray)
, и поскольку 2 здесь является константой, было легко полагаться просто на -1.
да, я пытался правильно сформулировать вопросы и начал с полной проблемы (которая, как вы и предполагали, касается кругов), но потом я понял, что проще было бы просто объяснить в терминах пикселей, что я и сделал, но забыл удалите первую часть. Я редактирую вопрос, чтобы это имело смысл. Спасибо за отличный ответ!
Какой у вас вопрос по программированию по этому поводу?