使用 np.arange 创建坐标对列表
Using np.arange to create list of coordinate pairs
我正在尝试使程序更快,我发现了这个 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
找出一些东西)。基本上是这样的:
在我处理的特定情况下,A
和 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]])
是否有任何 numpy.ndarray
的方法或 np.arange()
的操作无需 for
循环即可完成上图所示的操作?
或者是否有任何替代方法可以像链接的 post 显示的 np.arange()
一样快?
您可以使用 np.c_
组合 np.repeat
和 np.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]]
也许 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]])
我正在尝试使程序更快,我发现了这个 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
找出一些东西)。基本上是这样的:
在我处理的特定情况下,A
和 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]])
是否有任何 numpy.ndarray
的方法或 np.arange()
的操作无需 for
循环即可完成上图所示的操作?
或者是否有任何替代方法可以像链接的 post 显示的 np.arange()
一样快?
您可以使用 np.c_
组合 np.repeat
和 np.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]]
也许 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]])