我有一个二维 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)
,将 位置的 1 换成 0 即可desired_result
创建一个1x3
像素块网格。可以使用 位置的描述圆形/几何形状的坐标myarray
,然后创建一个圆形/几何形状网格。
对于问题的最后一部分,答案很简单。这就是广播的目的
一些解释:
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。