【问题标题】:Why I can not calculate distance between two numpy array?为什么我不能计算两个 numpy 数组之间的距离?
【发布时间】:2020-10-06 05:43:43
【问题描述】:

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的shape是(21000,784),data_train的shape是(2000,784)。当我运行这段代码时,它说:操作数不能与形状一起广播 (2000,784) (21000,784)

【问题讨论】:

  • 您在这里的预期结果是什么? Numpy 将尝试按元素减去值,但由于形状不同,这是不可能的。也许这可以帮助:stackoverflow.com/questions/50758165/…
  • 我的预期结果是这两个 NumPy 数组之间的距离
  • 我明白了。一个简单的例子来说明这里的问题:如果你有a = [1,2,3,4,5]b = [1,2],然后尝试使用a-b,那么它不会起作用(在这种情况下应该减去哪个元素?)。如果形状相同,那么逐元素减法将起作用,例如:a=[1,2]b=[1,2]a-b=[0,0]

标签: numpy numpy-ndarray array-broadcasting


【解决方案1】:

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

  • 从对应元素中减去 arr_2 中行 0 的元素 的 arr_1(也在第 0 行),
  • 1 行也一样,
  • 以此类推,直到两个数组的末尾。

只要两个数组的行数相同 和列。

此规则有 3 个例外:

  • 其中一个涉及的数组可以有单行。那么这一行是 广播(重复),因此这个数组在概念上具有尽可能多的 根据需要行。
  • 其中一个涉及的数组可以有一个单列。然后 上述广播沿进行。
  • 其中一个操作数是单个值。然后它被“扩展”为一个数组 与其他操作数(数组)中一样的行数/列数。

阅读 Numpy 中的广播以了解更多详细信息。

在您的情况下,上述情况均未发生。 两个数组的列数相同,但行数为 不同。 后果就是上面的广播不能进行,整个 操作失败。

可能的解决方案

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

那么你可以:

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

那么你可以:

  • 消除这些差异,
  • 总结一下,
  • 最后计算和的根,得到想要的距离。

【讨论】:

    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多