我想将一个数组中的每个向量与另一个数组中的所有向量进行比较,并计算每个向量有多少符号匹配。让我举个例子。我有两个数组,a和b。对于a 中的每个向量,我想将它与b中的每个向量进行比较。然后,我想返回一个新数组,该数组的维度是每个向量保存a中的向量与来自bnp.array((len(a),14))的向量匹配的次数0,1,2,3,4,..,12,13 。期望的结果显示在下面的数组c中。我已经使用解决了这个问题,但我的问题是(请参阅下面的函数),这占用了太多内存,因此当a和b变大np.newaxis()时我的计算机无法处理它。因此,我正在寻找一种更有效的方法来进行此计算,因为将维度添加到向量中会大大损害我的记忆力。一种解决方案是使用正常的 for 循环,但这种方法相当慢。是否有可能使这些计算更有效?a = array([[1., 1., 1., 2., 1., 1., 2., 1., 0., 2., 2., 2., 2.], [0., 2., 2., 0., 1., 1., 0., 1., 1., 0., 2., 1., 2.], [0., 0., 0., 1., 1., 0., 2., 1., 2., 0., 1., 2., 2.], [1., 2., 2., 0., 1., 1., 0., 2., 0., 1., 1., 0., 2.], [1., 2., 0., 2., 2., 0., 2., 0., 0., 1., 2., 0., 0.]])b = array([[0., 2., 0., 0., 0., 0., 0., 1., 1., 1., 0., 2., 2.], [1., 0., 1., 2., 2., 0., 1., 1., 1., 1., 2., 1., 2.], [1., 2., 1., 2., 0., 0., 0., 1., 1., 2., 2., 0., 2.], [0., 1., 2., 0., 2., 1., 0., 1., 2., 0., 0., 0., 2.], [0., 2., 2., 1., 2., 1., 0., 1., 1., 1., 2., 2., 2.], [0., 2., 2., 1., 0., 1., 1., 0., 1., 0., 2., 2., 1.], [1., 0., 2., 2., 0., 1., 0., 1., 0., 1., 1., 2., 2.], [1., 1., 0., 2., 1., 1., 1., 1., 0., 2., 0., 2., 2.], [1., 2., 0., 0., 0., 1., 2., 1., 0., 1., 2., 0., 1.], [1., 2., 1., 2., 2., 1., 2., 0., 2., 0., 0., 1., 1.]])c = array([[0, 0, 0, 2, 1, 2, 2, 2, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 2, 3, 1, 2, 1, 1, 0, 0, 0, 0], [0, 0, 0, 3, 2, 4, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 3, 0, 3, 2, 1, 1, 0, 0, 0, 0, 0], [0, 0, 1, 1, 4, 0, 3, 0, 1, 0, 0, 0, 0, 0]])我的解决方案:def new_method_test(a,b): test = (a[:,np.newaxis] == b).sum(axis=2) zero = (test == 0).sum(axis=1) one = (test == 1).sum(axis=1) two = (test == 2).sum(axis=1) c = np.concatenate((zero,one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen), axis = 0).reshape(14,len(a)).T return c谢谢你的帮助。
1 回答
长风秋雁
TA贡献1757条经验 获得超7个赞
欢迎来到 Stackoverflow!如果你想节省内存,我认为 for 循环是要走的路(而且它真的没那么慢)。此外,您可以使用np.bincount直接从一项测试转到您的 c 输出矩阵。我认为这种方法将与您的方法大致相同,并且相比之下它将使用更少的内存。
import numpy as npc = np.empty(a.shape, dtype=int)for i in range(a.shape[0]): test_one_vector = (a[i,:]==b).sum(axis=1) c[i,:] = np.bincount(test_one_vector, minlength=a.shape[1])
如果你真的在处理 a 和 b 中的浮点数,你应该考虑放弃相等检查 (==) 以支持邻近检查,例如np.isclose
添加回答
举报
0/150
提交
取消