我使用Python(3.7.7)和numpy(1.17.4)处理中等大小的2d numpy阵列(从5000x80到200000x120)。对于给定的数组,我想计算该数组的所有列向量对之间的Hadamard乘积
我有:
A A
[a,b,c,d] [a,b,c,d]
[1,2,3,4] [1,2,3,4]
[4,5,6,7] * [4,5,6,7]
[7,8,9,1] [7,8,9,1]
我想得到:
[a*b, ac, ad, bc, bd, cd]
[ 2., 3., 4., 6., 8., 12.]
[20., 24., 28., 30., 35., 42.]
[56., 63., 7., 72., 8., 9.]
我已经从一位同事那里得到了一个使用np.kron的解决方案,我对此有点认可:
def hadamard_kron(A: np.ndarray) -> :
"""Returns the hadamard products of all unique pairs of all columns,
and return indices signifying which columns constitute a given pair.
"""
n = raw_inputs.shape[0]
ind1 = (np.kron(np.arange(0, n).reshape((n, 1)), np.ones((n, 1)))).squeeze().astype(int)
ind2 = (np.kron(np.ones((n, 1)), np.arange(0, n).reshape((n, 1)))).squeeze().astype(int)
xmat2 = np.kron(raw_inputs, np.ones((n, 1))) * np.kron(np.ones((n, 1)), raw_inputs)
hadamard_inputs = xmat2[ind2 > ind1, :]
ind1_ = ind1[ind1 < ind2]
ind2_ = ind2[ind1 < ind2]
return hadamard_A, ind1_, ind2_
hadamard_A, first_pair_members, second_pair_members = hadamard_kron(a.transpose())
请注意,hadamard_A是我想要的,但是转置了(这也是我想要进一步处理的)。此外,ind1_(ind2_)给出了对象的索引,该对象作为计算hadamard乘积的对象对中的第一(第二)个元素。我也需要这些
然而,我觉得这段代码效率太低:它需要很长时间,而且由于我在算法中多次调用这个函数,我想知道是否有更聪明的解决方案?我是否忽略了一些可以巧妙地组合起来完成此任务的numpy/scipy工具
谢谢大家!:)
另一种与Divakar第一种方法相当的方法:
输出:
方法#1
最简单的带^{} -
方法#2
用于大型阵列的高效内存-
方法#3
基于掩蔽的一-
方法#4
将方法#2扩展为
numba
1-然后,利用
parallel
处理(正如@max9111在评论中指出的那样),如下-基准测试
使用^{} 包(打包在一起的一些基准测试工具;免责声明:我是它的作者)对建议的解决方案进行基准测试
结论:
Numba
的人似乎做得很好,而app2
的人则是裸体人相关问题 更多 >
编程相关推荐