【问题标题】:Dividing a square into N smaller squares and finding center coordinates of the N smaller squares将一个正方形分成 N 个较小的正方形并找到 N 个较小正方形的中心坐标
【发布时间】:2012-04-11 03:35:39
【问题描述】:

我有一个尺寸为 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 这就是我在这里学习的原因

【问题讨论】:

  • 我不清楚代码在做什么。 “25 个小方块”和“非对角元素”是什么意思?
  • @Steve I 为钙化编辑
  • 听起来您想从 100 个数字 (10x10) 开始,并以 25 (5x5) 结束。所以你想把每组 4 压缩成一个数字吗?
  • @tom 尺寸为 10×10,例如 a 面为 10 米,b 面为 10 米。然后我想要做的是将 10×10 正方形分成更小的正方形并找到这些小正方形的中心。在我的示例中,较小的正方形的尺寸为 2 米×2 米。我编辑了我原来的问题以更好地反映这一点
  • @Surfcast23:您发布的代码在语法上不是正确的 Python。你能修好吗?在父正方形的上下文中,什么是“非对角线”元素和“x(0) 和 y(0) 坐标”?您的代码也以整数进行这些计算。这真的是你想要的吗?尽管您进行了编辑,但这是一个非常令人困惑的问题。

标签: python for-loop numpy sorting


【解决方案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.]]])

【讨论】:

  • 感谢您的帮助 Bago。我需要的是一个具有正方形中心的 x 和 y 坐标的数组
  • mgrid 返回一个数组,我将它一分为二,因为我没有仔细阅读您的问题,我已经更新了我的答案以显示如何将其保留为一个数组。
  • 我在尝试代码时不断收到此错误。 Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> centers = np.mgrid[dx/2:N*dx:dx,dy/2*N:dy:dy] File "C:\Python32\lib\site-packages\numpy\lib\index_tricks.py", line 166, in __getitem__ nn = _nx.indices(size, typ) File "C:\Python32\lib\site-packages\numpy\core\numeric.py", line 1511, in indices res = empty((N,)+dimensions, dtype=dtype) ValueError: negative dimensions are not allowed',我看不到负维度来自哪里
  • 通知,dy/2*N:dy:dy。如果你想 [9,7, ...] 使用dy*N:dy/2:-dy。如果你想 [1,3, ...] 使用 dy/2:N*dy:dy
  • 非常感谢!我已经盯着代码看了一段时间,但没有发现那个错字
【解决方案2】:

您想要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])

【讨论】:

  • 我有对角线元素,我需要的是非对角线元素
  • 对不起,我没有正确解释我的输出并提出了错误的问题
  • @Surfcast23:这正是史蒂夫给你的——仔细看看x.diagonal(offset=N)的输出。
【解决方案3】:

如果我正确理解您的问题,您似乎只是想要这样的东西(使用 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) 处计算。然后可以使用Kronecker product 方便地计算 x 和 y 坐标的完整数组,我认为这可能是“非对角线条目”与您提到的“对角线条目”的联合。这给出了一对 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.]]

【讨论】:

  • 感谢您的帮助。我不知道这很酷的 Kron 功能。我真正需要的是一个包含小方块中心的 x 和 y 坐标的数组
  • 这些值是每个小方块中心的 x 和 y 坐标,相对于“父”方块上的固定位置。您希望如何存储坐标?作为一个元组?作为数组中的另一个维度?
  • 如何将数据存储为元组?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多