【问题标题】:Using np.arange to create list of coordinate pairs使用 np.arange 创建坐标对列表
【发布时间】:2019-11-03 20:23:25
【问题描述】:

我试图让程序更快,我发现了这个post,我想实现一个类似于该问题中给出的第四个案例的解决方案。

这是我正在使用的代码的相关部分:

count = 0
hist_dat = np.zeros(r**2)
points = np.zeros((r**2, 2))
for a in range(r):
    for b in range(r):
        for i in range(N):
            for j in range(N):
                hist_dat[count] += retval(a/r, (a+1)/r, data_a[i][j])*retval(b/r, (b+1)/r, data_b[i][j])/N
                points[count][0], points[count][1] = (a+0.5)/r, (b+0.5)/r
        count += 1

此代码的作用是生成归一化二维直方图的值(每个方向都有“r”个分区),这些值的坐标为numpy.ndarray。 正如您在链接的另一个问题中看到的那样,我目前正在使用第二个最糟糕的解决方案,它需要几分钟才能运行。

对于初学者,我想更改代码为 points 数组所做的事情(我认为一旦我能看到它是如何完成的,我就可以为 hist_dat 找出一些东西)。基本上是这样的:

在我正在处理的特定情况下,AB 是相同的。例如,它可能就像从array([0, 0.5, 1])array([[0,0], [0,0.5], [0,1], [0.5,0], [0.5,0.5], [0.5,1], [1,0], [1,0.5], [1,1]])

numpy.ndarraynp.arange() 的操作是否有任何方法可以完成上图所示的操作,而无需 for 循环?

或者是否有任何替代方法可以像链接帖子中显示的 np.arange() 一样快?

【问题讨论】:

  • 这张图到底代表什么?
  • 您有两个numpy.ndarray,您将它们组合成一个包含所有可能组合的组合。如果您愿意,可以将其视为集合的笛卡尔积。另外,上面的代码 sn-p 就是这样做的。
  • “集合”是指数学集合吗?在这种情况下,两个数组(data_adata_b,对吗?)的大小在转换为集合后是否可能不相等(因为它们具有不同数量的唯一元素)?
  • 不,它们的大小相同(实际上,在我使用的情况下,它们完全相同)。例如,它可能就像从array([0, 0.5, 1])array([[0,0], [0,0.5], [0,1], [0.5,0], [0.5,0.5], [0.5,1], [1,0], [1,0.5], [1,1]])。所以它就像一个“x”和“y”坐标的数组。
  • 我的回答能解决您的问题吗?如果是这样,您可能希望编辑您的问题以专注于抽象问题,如您所说,采用集合的笛卡尔积(尽管我的回答实际上假设元素是唯一的,添加 np.unique 是微不足道的打电话)

标签: python numpy statistics numpy-ndarray scientific-computing


【解决方案1】:

您可以使用np.c_ 组合np.repeatnp.tile 的结果:

import numpy as np

start = 0.5
end = 5.5
step = 1.0

points = np.arange(start, end, step)  # [0.5, 1.5, 2.5, 3.5, 4.5]
output = np.c_[np.repeat(points, n_elements), np.tile(points, n_elements)]

print(output)

输出:

[[0.5 0.5]
 [0.5 1.5]
 [0.5 2.5]
 [0.5 3.5]
 [0.5 4.5]
 [1.5 0.5]
 [1.5 1.5]
 [1.5 2.5]
 [1.5 3.5]
 [1.5 4.5]
 [2.5 0.5]
 [2.5 1.5]
 [2.5 2.5]
 [2.5 3.5]
 [2.5 4.5]
 [3.5 0.5]
 [3.5 1.5]
 [3.5 2.5]
 [3.5 3.5]
 [3.5 4.5]
 [4.5 0.5]
 [4.5 1.5]
 [4.5 2.5]
 [4.5 3.5]
 [4.5 4.5]]

【讨论】:

  • n_elements 是什么?
  • @SV 在这种情况下,它只是帮助使用np.arange 生成输入数据。如果您有一个输入数组,您只需将其分配给points 并将n_elements 替换为len(points)
【解决方案2】:

也许np.mgird 会有所帮助?

import numpy as np
np.mgrid[0:2:.5,0:2:.5].reshape(2,4**2).T

输出:

array([[0. , 0. ],
       [0. , 0.5],
       [0. , 1. ],
       [0. , 1.5],
       [0.5, 0. ],
       [0.5, 0.5],
       [0.5, 1. ],
       [0.5, 1.5],
       [1. , 0. ],
       [1. , 0.5],
       [1. , 1. ],
       [1. , 1.5],
       [1.5, 0. ],
       [1.5, 0.5],
       [1.5, 1. ],
       [1.5, 1.5]])

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2021-02-25
    • 2021-02-27
    • 2021-06-06
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多