将一个正方形划分为N个较小的正方形并找到N个较小正方形的中心坐标

时间:2012-04-11 03:35:39

标签: python for-loop numpy sorting

我有一个尺寸为10x10的正方形,我希望将其划分为25个尺寸为2x2的较小正方形,所以最后我将得到一个5x5数组。我还想做的是找到每个的中心坐标新广场。我已经编写了以下代码作为起点,它给出了x(0)和y(0)坐标的正方形中心的坐标。我已经尝试过嵌套,但这给了我很高的y值。我知道我需要保持一个变量固定并迭代另一个变量。我不确定如何链接它们。如果任何人可以帮助或指出一些有助于找到非对角线元素的文档,我们将不胜感激。提前谢谢。

def Cell_centers():
 dx = 2
 dy = 2             #length of cell side
 N = 5              #number of cells
 Xc = zeros(N)      #array creation
 Yc = zeros(N)             
 x1=0
 y1=0

 for i in range(N):       #for loops to define cell centers
   Xc[i] = dx/2 +x1                  
   x1+=dx                   #increments x1 positions by dx
 for j in range(N):
   Yc[j] = dy/2 +y1
   y1+=dy

 centers = np.array((Xc, Yc), dtype=float)    
return(centers)       

例如,如果我们有一个方形,每边2个,并将其分成四个长度为1的方格,我想要的是这样的东西

 [(.5 ,1.5),(1.5,1.5)]
 [(.5,.5)  ,(.5 ,1.5)]

我不知道这是不是正确的Python,这就是我在这里学习的原因

3 个答案:

答案 0 :(得分:1)

您想要diagonal方法吗?

In [1]: x = scipy.randn(5,5)

In [2]: x
Out[2]: 
array([[ 0.90077481,  0.33192388, -0.16153472, -0.78663912, -2.45735516],
       [ 0.51063641,  0.01209047, -0.39667355, -0.9603519 , -0.19263007],
       [-0.73422795, -0.45595695, -0.8915272 ,  0.20074704, -0.78286524],
       [ 0.53628315,  0.93238853, -1.16648829,  1.26122884, -0.70490362],
       [ 0.31389001, -1.48574572,  2.16641639, -0.67982623, -0.59455518]])

In [3]: x.diagonal(offset=2)
Out[3]: array([-0.16153472, -0.9603519 , -0.78286524])

In [4]: x.diagonal(offset=-3)
Out[4]: array([ 0.53628315, -1.48574572])

答案 1 :(得分:1)

如果我理解你的问题,你似乎只想要这样的东西(用numpy数组实现):

import numpy as np

n=5
dx=2.
dy=dx

x=(dx/2.)+dx*np.arange(0,n).reshape((n,1))
y=(dy/2.)+dy*np.arange(0,n).reshape((1,n))

xcoords=np.kron(np.ones_like(x.T),x)
ycoords=np.kron(y,np.ones_like(y.T))

此处xy包含我认为您所指的“对角线条目”,即。每个唯一的x坐标和y坐标,假设正方形的“左上角”为(0,0)而计算。完整的x和y坐标数组,我认为可能是“非对角线条目”与你提到的“对角线条目”的结合,然后可以使用Kronecker product方便地计算。这给出了一对5x5阵列,一个保持所有中心的x坐标,另一个保持相应的y坐标:

In [77]: print xcoords
[[ 1.  1.  1.  1.  1.]
 [ 3.  3.  3.  3.  3.]
 [ 5.  5.  5.  5.  5.]
 [ 7.  7.  7.  7.  7.]
 [ 9.  9.  9.  9.  9.]]

In [78]: print ycoords
[[ 1.  3.  5.  7.  9.]
 [ 1.  3.  5.  7.  9.]
 [ 1.  3.  5.  7.  9.]
 [ 1.  3.  5.  7.  9.]
 [ 1.  3.  5.  7.  9.]]

答案 2 :(得分:1)

这是你想要的(我更新它以返回一个数组)?

import numpy as np
dx = 2.
dy = 2.
N = 5
centers = np.mgrid[dx/2:N*dx:dx, dy/2:N*dy:dy]

结果是:

>>> centers.shape
(2, 5, 5)
>>> centers
array([[[ 1.,  1.,  1.,  1.,  1.],
        [ 3.,  3.,  3.,  3.,  3.],
        [ 5.,  5.,  5.,  5.,  5.],
        [ 7.,  7.,  7.,  7.,  7.],
        [ 9.,  9.,  9.,  9.,  9.]],

       [[ 1.,  3.,  5.,  7.,  9.],
        [ 1.,  3.,  5.,  7.,  9.],
        [ 1.,  3.,  5.,  7.,  9.],
        [ 1.,  3.,  5.,  7.,  9.],
        [ 1.,  3.,  5.,  7.,  9.]]])

更新:如果您希望坐标位于最后一个维度,则可以使用rollaxis。

>>> centers = np.rollaxis(centers, 0, centers.ndim)
>>> centers.shape
(5, 5, 2)
>>> centers
array([[[ 1.,  1.],
        [ 1.,  3.],
        [ 1.,  5.],
        [ 1.,  7.],
        [ 1.,  9.]],

       [[ 3.,  1.],
        [ 3.,  3.],
        [ 3.,  5.],
        [ 3.,  7.],
        [ 3.,  9.]],

       [[ 5.,  1.],
        [ 5.,  3.],
        [ 5.,  5.],
        [ 5.,  7.],
        [ 5.,  9.]],

       [[ 7.,  1.],
        [ 7.,  3.],
        [ 7.,  5.],
        [ 7.,  7.],
        [ 7.,  9.]],

       [[ 9.,  1.],
        [ 9.,  3.],
        [ 9.,  5.],
        [ 9.,  7.],
        [ 9.,  9.]]])