【发布时间】:2018-12-16 11:05:03
【问题描述】:
我有一个大小为 I*J 的输入矩阵 A
还有一个大小为 N*M 的输出矩阵 B
还有一些预先计算好的大小为 N*M*2 的地图,它规定了 B 中的每个坐标,以及要采用 A 中的哪个坐标。该地图没有我可以使用的特定规则或线性。只是一张看似随机的地图。
矩阵非常大(~5000*~3000),所以创建映射矩阵是不可能的(5000*3000*5000*3000)
我设法使用简单的地图和循环来做到这一点:
for i in range(N):
for j in range(M):
B[i, j] = A[mapping[i, j, 0], mapping[i, j, 1]]
我设法使用索引来做到这一点:
B[coords_y, coords_x] = A[some_mapping[:, 0], some_mapping[:, 1]]
# Where coords_x, coords_y are defined as all of the coordinates:
# [[0,0],[0,1]..[0,M-1],[1,0],[1,1]...[N-1,M-1]]
这效果要好得多,但还是有点慢。
我有无限的时间提前计算映射或任何其他实用程序计算。但是在这些预先计算之后,这种映射应该尽可能快地发生。
目前,我看到的唯一其他选择就是用 C 或更快的方式重新实现它......
(如果有人好奇,我会用其他一些不同形状和方向的图像创建一个图像,并进行一些编码。但它的映射非常复杂,而不是简单或线性的东西使用)
【问题讨论】:
-
你试过了吗:
B = A[mapping[:,:, 0], mapping[:,:,1]]? -
如何选择这个计算的输出形状?
-
这不会自动完成,因为
mapping和B在它们的前两个轴上具有相同的形状?仅供参考:我正在关注您的代码:B[i, j] = A[mapping[i, j, 0], mapping[i, j, 1]]. -
你是对的。它奏效了,给了我近 50% 的改进。谢谢!
标签: python python-3.x numpy matrix optimization