问题描述
我使用Python(3.7.7)和numpy(1.17.4),正在处理中等大小的2d numpy数组(从5000x80到200,000x120)。对于给定的阵列,我想计算该阵列的所有可能的列向量对之间的Hadamard乘积。
我有:
A A
[a,b,c,d] [a,d]
[1,2,3,4] [1,4]
[4,5,6,7] * [4,7]
[7,8,9,1] [7,1]
我想得到:
[a*b,ac,ad,bc,bd,cd]
[ 2.,3.,4.,6.,8.,12.]
[20.,24.,28.,30.,35.,42.]
[56.,63.,7.,72.,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,np.arange(0,1)))).squeeze().astype(int)
xmat2 = np.kron(raw_inputs,1))) * np.kron(np.ones((n,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_)给出了对象的索引,这些对象的特征是在为其计算哈达玛德积的对中的第一个(第二个)元素。我也需要这些。
但是,我觉得这段代码效率太低:花了很长时间,而且由于我在算法中多次调用了此函数,所以我想知道是否有一个更聪明的解决方案?我可以忽略一些我可以巧妙地结合使用的numpy / scipy工具吗?
谢谢! :)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)