【问题标题】:How to compute distance formula between a 1d and an nd array?如何计算 1d 和 nd 数组之间的距离公式?
【发布时间】:2018-12-14 05:43:41
【问题描述】:

我正在尝试减去一维数组:

probe = [1, 2, 3, 4, 5, 6] 

来自 nd 数组中的每个元素:

k = np.array([["words words ", 1,1,3,4,6,7], ["blah blah", 2,8,7,5,3,2], [" please help me", 3,4, 5, 6, 7,1], [" What are you doing, man", 1,3,5,10,9,11]])

我删除了 k 数组的第 0 个索引并将这些值存储在 new_k 中,以便现在比较我要比较的两个数组中的值。

new_k = k
new_k = np.delete(new_k, 0, axis=1)

我正在尝试在 nd 数组中找到最接近输入的值。我需要帮助。

到目前为止,我已经设法到达这里,但我迷路了。:

for i in range(len(new_k)):
    for j in range(len(new_k[0][1])):
        temp[j] = (new_k[1][j] - probe[j])
        new_k[i][1] = temp

print(new_k)
new_k2 = new_k*new_k

上面的代码抛出这个错误:

TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')

另外:我知道如何通过将单个值与值数组进行比较来获得“最接近的值”,但我想通过数组到数组来做到这一点

【问题讨论】:

  • 能否请您粘贴完整的代码。正如 new_k 所说的未知。
  • 你的 new_k 在哪里?

标签: python arrays numpy numpy-ndarray


【解决方案1】:

Numpy 数组并不意味着具有多种数据类型。 k 实际上是一个字符串数组,因此您的数组k 中没有要减去的数字数据类型。

如果您想保留第一列字符串,您应该查看 pandas 数据框。您可以将字符串保留为数据框的索引,但仍将其作为数字数据数组进行操作。使用您的数据,您可以执行以下操作:

df = pd.DataFrame(k[:, 1:].astype(int), index=k[:, 0])
df - probe

【讨论】:

    【解决方案2】:
    np.asarray(k[:,1:], dtype=int) - probe
    

    【讨论】:

      【解决方案3】:

      问题在于 numpy 不像普通列表,它一次只包含唯一类型的元素。如果有超过 1 种类型,则全部转换为 U32,即 string。当您从列表中删除第一个元素时,其余元素仍然是字符串类型,而不是 int。您应该已将它们转换为 int。因此会引发此错误:

      TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')
      

      当你尝试这个时:

      temp[j] = (new_k[1][j] - probe[j])
      

      【讨论】:

        【解决方案4】:
        In [263]: probe = [1, 2, 3, 4, 5, 6] 
        

        k 有一个 dtype 可以容纳字符串:

        In [264]: k = np.array([["words words ", 1,1,3,4,6,7], ["blah blah", 2,8,7,5,3,2
             ...: ], [" please help me", 3,4, 5, 6, 7,1], [" What are you doing, man", 1
             ...: ,3,5,10,9,11]])
        In [265]: k
        Out[265]: 
        array([['words words ', '1', '1', '3', '4', '6', '7'],
               ['blah blah', '2', '8', '7', '5', '3', '2'],
               [' please help me', '3', '4', '5', '6', '7', '1'],
               [' What are you doing, man', '1', '3', '5', '10', '9', '11']],
              dtype='<U24')
        

        但是通过切掉第一列,剩下的可以转换成整数数组:

        In [266]: k[:, 1:].astype(int)
        Out[266]: 
        array([[ 1,  1,  3,  4,  6,  7],
               [ 2,  8,  7,  5,  3,  2],
               [ 3,  4,  5,  6,  7,  1],
               [ 1,  3,  5, 10,  9, 11]])
        

        这是一个 (4,6) 数组。 np.array(probe) 是 (6,);广播让我们减去它:

        In [270]: k[:, 1:].astype(int) - np.array(probe)
        Out[270]: 
        array([[ 0, -1,  0,  0,  1,  1],
               [ 1,  6,  4,  1, -2, -4],
               [ 2,  2,  2,  2,  2, -5],
               [ 0,  1,  2,  6,  4,  5]])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-09
          • 1970-01-01
          • 2017-04-21
          • 2023-04-09
          • 1970-01-01
          • 2019-04-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多