我有一个形状为M*3的大型数组A,它的每一行的元素都是从0到N-1的唯一非负整数.实际上,在我的有限元分析中,每一行对应一个三角形.
例如,M=4,N=5,矩阵A如下所示
array([[0, 1, 2],
[0, 2, 3],
[1, 2, 4],
[3, 2, 4]])
现在,我需要构造另一个大小为M*N的数组B,以便
B[m,n] = 1 if n is in A[m], or else 0
上述示例性A的对应B将是
1 1 1 0 0
1 0 1 1 0
0 1 1 0 1
0 0 1 1 1
基于循环的代码将是
B = np.zeros((M,N))
for m in range(M):
for n in B[m]:
B[m,n]=1
但是由于我有很大的M和N(每个都有10^6的刻度),我如何使用好的块索引技术来加速这个过程?此外,我觉得也需要稀疏矩阵技术,因为1字节的M*N数据大约是10**12,即1000G.
总的来说,我觉得使用NumPy的矢量化技术,如索引和广播,看起来更像是一种临时的、容易出错的活动,依赖于相当多的街头智慧(如果你愿意,也可以称之为艺术).有没有什么编程语言可以系统地将基于循环的代码转换为高性能的矢量化版本?