- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个结构化网格,大约有 3e+6 个点,
请查看图片: /image/eUUkQ.jpg
物理域(欧几里得)中的每个点在计算域中都有一个索引(i、j 和 k)。
我需要迭代计算域索引并使用相应的点进行计算。
例如,给定索引处 i 方向的长度将为(伪代码): length = vec_len(point(i+1, j, k) - point(i, j, k))
找出给定点的长度比也很重要。例如,我会计算 i 方向上两个附近的长度并在它们之间进行除法。
我的想法花费了太多时间,并且可能没有充分利用 NumPy 提供的全部潜力。
我制作了一个用零填充的 ndarray,它可以保存所有网格 XYZ 坐标。
block_data =numpy.zeros((i_dim, j_dim, k_dim, 3), dtype='float')
数字 3 对应 3 个元素:x、y 和 z。
因此,如果我想要 i=3, j=7, k=10 处的 z 值,则为:
Z = block_data[3][7][10][2]
欧几里得空间中的点将是 (1,3) ndarray:
point = block_data[i][j][k]
我计算两点之间的长度的方法是:
numpy.linalg.norm(point2 - point1)
仅长度计算需要大约1.5ms,我想计算所有点和所有方向的距离:3e+6 * 3。
我认为我构建主 block ndarray(block_data)的方法存在问题,因为它限制我一次只能对两个点进行计算,即只有两个小(1,3) ) ndarrays。如果我没记错的话,在小数组上进行计算效率不高。
我怎样才能解决这个问题并使运行时间更快?有没有关于这类问题的书推荐?谢谢:-)
最佳答案
要计算这种大小的数组中的欧几里德距离,我建议使用矢量化方法:
def euclid_dist(array, direction):
if direction == 'i': # make shifted views depending on the direction
p1 = array[:-1, :, :]
p2 = array[1:, :, :]
elif direction == 'j':
p1 = array[:, :-1, :]
p2 = array[:, 1:, :]
elif direction == 'k':
p1 = array[:, :, :-1]
p2 = array[:, :, 1:]
else:
raise ValueError('direction ' + direction + ' not known.')
# get euclidean distance for all points in direction:
euc_dist = (((p1 - p2)*(p1 - p2)).sum(axis=3))**0.5
return euc_dist
使用小型测试数组:
arr = np.random.randint(-20, 20, 5*5*5*3).reshape(5, 5, 5, 3)
eu_i = euclid_dist(arr, 'i')
eu_j = euclid_dist(arr, 'j')
# test some values:
print(eu_i[2, 1, 2] == np.linalg.norm(arr[2, 1, 2] - arr[3, 1, 2]))
# Out 64: True
print(eu_j[1, 1, 1] == np.linalg.norm(arr[1, 1, 1] - arr[1, 2, 1]))
# Out 65: True
具有 8e6
点和 24e6
值的大数组的一些计时:
big_arr = np.random.rand(200, 200, 200, 3)
%timeit euclid_dist(big_arr, 'i')
# 644 ms ± 57.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
恕我直言,对于这样大小的数组来说,这已经相当快了。 :) 如果我正确地读取了你的计时,这比你的代码快大约 19000 倍。
关于python - 计算 CFD 网格中点之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51079247/
我需要你的帮助!我在它们之间放置了随机数量的 div。 Item description Item description Item description Item
我有两个 NSDates,时间格式为“h:mm a”(即 6:00 AM 和 8:00 PM)。 我试图找出这两个时间之间的中点是什么时间。 对于上面的示例,早上 6:00 和晚上 8:00 之间的中
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我正在寻找一种有效的算法来检查一个点是否在 3D 中的另一个点附近。 sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2) < radius 这似乎并不太快,实际上我不需要这
我可以让 pandas cut/qcut 函数返回 bin 端点或 bin 中点而不是一串 bin 标签吗? 目前 pd.cut(pd.Series(np.arange(11)), bins = 5)
我是一名优秀的程序员,十分优秀!