为什么我不能计算两个numpy数组之间的距离?

问题描述

1。我有两个numpy数组,分别是data_test和data_train

    data_partial_test = data_test[:2000,:]
    test_lable = label_test
    print(test_lable.shape)
    print(data_partial_test[0].shape)
    print(data_train[0].shape)
    dis = (( data_partial_test- data_train[:21000,])**2).sum(axis=1)

2。data_test的形状为(21000,784),而data_train的形状为(2000,784)。当我运行此代码时,它说:操作数不能与形状一起广播(2000,784)(21000,784)

解决方法

当您执行数组减法时,例如 arr_1-arr_2 , 然后实际上是 Numpy 尝试:

  • 从相应元素中减去 arr_2 中第 0 行的元素 的 arr_1 (也在行 0 中),
  • 与第 1 行相同,
  • 依次类推,直到两个数组的末尾。

只要两个数组的行数相同,此方案就可以使用 和列。

此规则有3个例外:

  • 涉及的数组之一可以有一个单行。然后这行是 广播(重复),以便此数组在概念上具有尽可能多的 行。
  • 所涉及的数组之一可以具有单列。然后 上面提到的广播是沿着进行的。
  • 操作数之一是单个值。然后将其“扩展”为数组 与其他操作数(数组)中的行/列数相同。

阅读有关 Numpy 中广播的信息,以对此有更详细的了解。

在您的情况下,不会发生上述情况。 两个数组的列数相同,但行数为 不同。 结果是无法执行上述广播,并且整个 操作失败。

可能的解决方案

也许第一个数组中的每一行(行数较少)可以是 与第二个阵列中的一行“配对”,例如基于一些关键领域。 可以在 Pandas 中执行此操作。请参阅 Pandas 中的 join 方法。

然后您可以:

  • 将两个 Numpy 数组都转换为 pandasonic DataFrames,
  • 在这些DataFrame上执行 join (通常基于公共密钥 设置为每个DataFrame中的索引)
  • 计算适当的列对之间的差异。

然后您可以:

  • 平方这些差异
  • 总结一下,
  • 最后计算总和的根,得到所需距离。