将像素放置在网格上

问题描述 投票:0回答:1

我有一个二维 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
处的 1 替换为 0,从而创建由
1x3
像素块组成的网格。 人们可以在
myarray
处使用描述圆形/几何形状的坐标,然后创建圆形/几何形状的网格。

python numpy numpy-ndarray
1个回答
2
投票

对于问题的最后一部分,答案很简单。这就是广播的目的

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]]]
,即一个 3D 数组,其第一维只有 1 个元素(myarray 本身)。所以一个 1×3×2 的数组,比如
A[0,i,j]
=
myarray[i,j]

B=
np.array(mygrid)[:,None,:]
[[[70,70]],[[100,100]],[[30,30]]]
,所以是一个 3D 数组,其第二维每次只有 1 个元素。所以一个 3×1×2 数组,例如
B[i,0,j]
=
mygrid[i,j]

并且由于广播,将大小为 1 的数组 X 添加到大小为 n 的数组 Y 中,会在 Y 的 n 个元素中的每个元素上添加元素(

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。

© www.soinside.com 2019 - 2024. All rights reserved.