使用np.arange创建坐标对列表

时间:2019-06-21 01:21:10

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

我试图使程序更快,我发现了这个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

此代码的作用是生成归一化的2D直方图的值(在每个方向上都有“ r”分度),并且这些值的坐标为numpy.ndarray。 正如您在链接的另一个问题中看到的那样,我目前正在使用第二坏的解决方案,并且要花几分钟的时间。

对于初学者来说,我想更改代码对points所做的工作(我认为,一旦我看到了如何完成操作,就可以对hist_dat有所了解)。基本上是这样的: creation of the "points" numpy.ndarray

在我正在处理的特定情况下,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.ndarray的方法或使用np.arange()的操作可以执行上图所示的操作,而无需for循环?

或者有没有其他方法可以像链接的帖子显示的np.arange()一样快?

2 个答案:

答案 0 :(得分: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]]

答案 1 :(得分:1)

也许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]])