Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数,该函数返回与';在未排序的多维数组中,A?_Python_Python 2.7_Numpy_Multidimensional Array - Fatal编程技术网

Python 函数,该函数返回与';在未排序的多维数组中,A?

Python 函数,该函数返回与';在未排序的多维数组中,A?,python,python-2.7,numpy,multidimensional-array,Python,Python 2.7,Numpy,Multidimensional Array,正如标题所述,我想创建一个函数,它将采用多维数组a和数字B,最终返回a中与B最接近的数字。如果数字B在a中,则返回它。如果A中有两个数字与B的距离相等,则通过逐行计数选择第一个数字 这是我目前掌握的代码: import numpy as np def g_C(A,B): A = np.asanyarray(A) assert A.ndim == 2 # to assert that A is a multidimensional array. get = (np.abs(A-B)).

正如标题所述,我想创建一个函数,它将采用多维数组a和数字B,最终返回a中与B最接近的数字。如果数字B在a中,则返回它。如果A中有两个数字与B的距离相等,则通过逐行计数选择第一个数字

这是我目前掌握的代码:

import numpy as np
def g_C(A,B):
  A = np.asanyarray(A)
  assert A.ndim == 2 # to assert that A is a multidimensional array.
  get = (np.abs(A-B)).argmin()
  return (A[get])

然而,根据我的理解,我认为
(np.abs(M-N)).argmin()
真的只对排序数组有效吗?我不允许在这个问题中对数组进行排序;我必须对它进行面值计算,逐行检查,并获取与B最接近的数字的第一个实例

例如,
gc([1,3,6,-8],[2,7,1,0],[4,5,2,8],[2,3,7,10]],9)
应该返回
8

另外,我得到的提示是,
numpy.argmin
会有所帮助,我看到它的目的是提取发生的第一个事件,这在这个问题上是有意义的,但我不确定如何将其精确地融入到我目前的代码中

编辑 这个简单的建议很管用。谢谢大家

我正在尝试拉金·罗斯福的第二个建议,但我被卡住了

def g_C(A,B):
  A = np.asanyarray(A)
  D = np.full_like(A, B) # created an array D with same qualities as array A, but just filled with values of B
  diffs = abs(D-A) # finding absolute value differences between D and A
  close = diffs.argmin(axis=1) # find argmin of 'diffs', row by row
  close = np.asanyarray(close) # converted the argmins of 'diff' into an array
  closer = close.argmin() # the final argmin ??
  return closer

我之所以尝试这个建议,是因为我有另一个与此相关的问题,我必须提取与B最接近的行的总和。我认为这是一个很好的做法。

您的问题与“查找最小值”问题相同。唯一的区别是,您正在寻找
min(abs(A[i]-B))
。所以,迭代你的数组。在执行此操作时,记录最小的绝对增量及其发生的索引。当发现较小的增量时,更新记录,然后继续搜索。当您完成所有操作后,返回记录索引中的任何值


由于您使用的是numpy数组,另一种方法是您可以创建一个与
A
大小相同的数组,但只填充值
B
。计算数组之间的差异,然后对每行使用
argmin
。为每行组合一个包含所有最小值的数组,然后再次执行argmin以提取最小值。

您现有的代码没有问题,除非默认情况下,
argmin
返回展平数组的索引。所以你可以

return A.flat[abs(A - B).argmin()]
从A中获取正确的值

编辑:对于您的另一个问题-在二维数组a中查找总和最接近B的行-您可以执行以下操作:

return A[abs(A.sum(axis=1) - B).argmin()]

在这两种情况下,我都不认为有必要创建一个B数组。

这将适用于任何带有嵌套的
for循环的
二维
数组,但我不确定这是否是您想要的(因为它不使用
numpy


这只是线性搜索(O(n)是一个下限)。要么巧妙地循环一次(非矢量化),要么进行两次传递:矢量化op 1中的差异到b。然后是argmin。多维部分有点不确定。假设您希望处理所有值,则分带取决于展平顺序(行-列与列-行)。编辑:好的,你提到它是按行的。“但是从我的理解来看,我认为(np.abs(M-N)).argmin()真的只对排序数组有效?”-我不认为是这样的-你有没有一个来源表明这一点?”我认为(np.abs(M-N)).argmin()真的只对排序数组有效?
argmin()
适用于未排序的数组。将
return(A[get])
更改为
return A.flat[get]
即可。如果您不介意,我正在尝试您的第二个建议,我对最后一句话有点困惑。我该如何确保提取的是数组的原始位置,而不是差分的值?这就是我到目前为止所得到的:
def g_C(A,B):A=np.asanyarray(A)D=np.full_like(A,B)#创建了一个与数组A质量相同的数组D,但只填充了B diffs=abs(D-A)的值#查找D和A之间的绝对值差异=diffs.argmin(axis=1)#查找“diffs”的argmin,逐行close=np.asanyarray(close)#将'diff'的argmin转换为数组closer=close.argmin()#最后的argmin??return closer
对不起,这看起来很难看,我应该把它编辑成我原来的问题吗?@zainy,我认为Stuart的答案比我的好,基本上是按照我第二段的建议做的。是的,但我有点难以理解如何将Stuart的答案改编成类似的问题,即在多维数组中提取行,和B最接近的数字
def g_C(A, B):
    i = A[0][0]
    m = abs(B - A[0][0])
    for r in A:
        for i in r:
            if abs(B - i) < m:
                m = abs(B - i)
                n = i
    return n
>>> g_C([[1,3,6,-8],[2,7,1,0],[4,5,2,8],[2,3,7,10]],9)
8