改变输入数组维度的广播函数
Broadcast function that changes dimension of the input array
给定一些接受 1D
数组并给出 2D
数组的函数 f
,是否可以将它有效地应用于 NxM
数组的每一行 A
?
更具体地说,我想对 NxM
数组 A
的每一行应用 np.triu
,然后连接所有结果。我可以通过
实现
B = np.dstack(map(np.triu, A))
给出 MxMxN
矩阵。然而,这对于大 N 不是很有效。不幸的是,函数 np.apply_along_axis
不能在这里使用,因为 f
改变维度。
了解 NumPy 在高效广播方面的强大功能,我几乎可以肯定存在更好的解决方案来解决我的问题。
这是使用 broadcasting
-
的矢量化方法
Bout = A.T*(np.tri(A.shape[1],dtype=bool).T[...,None])
运行时测试和输出验证-
In [319]: A = np.random.randint(0,20,(400,100))
In [320]: %timeit np.dstack(map(np.triu, A))
10 loops, best of 3: 69.9 ms per loop
In [321]: %timeit A.T*(np.tri(A.shape[1],dtype=bool).T[...,None])
10 loops, best of 3: 24.8 ms per loop
In [322]: B = np.dstack(map(np.triu, A))
In [323]: Bout = A.T*(np.tri(A.shape[1],dtype=bool).T[...,None])
In [324]: np.allclose(B,Bout)
Out[324]: True
给定一些接受 1D
数组并给出 2D
数组的函数 f
,是否可以将它有效地应用于 NxM
数组的每一行 A
?
更具体地说,我想对 NxM
数组 A
的每一行应用 np.triu
,然后连接所有结果。我可以通过
B = np.dstack(map(np.triu, A))
给出 MxMxN
矩阵。然而,这对于大 N 不是很有效。不幸的是,函数 np.apply_along_axis
不能在这里使用,因为 f
改变维度。
了解 NumPy 在高效广播方面的强大功能,我几乎可以肯定存在更好的解决方案来解决我的问题。
这是使用 broadcasting
-
Bout = A.T*(np.tri(A.shape[1],dtype=bool).T[...,None])
运行时测试和输出验证-
In [319]: A = np.random.randint(0,20,(400,100))
In [320]: %timeit np.dstack(map(np.triu, A))
10 loops, best of 3: 69.9 ms per loop
In [321]: %timeit A.T*(np.tri(A.shape[1],dtype=bool).T[...,None])
10 loops, best of 3: 24.8 ms per loop
In [322]: B = np.dstack(map(np.triu, A))
In [323]: Bout = A.T*(np.tri(A.shape[1],dtype=bool).T[...,None])
In [324]: np.allclose(B,Bout)
Out[324]: True