Python 函数,该函数返回与';在未排序的多维数组中,A?
正如标题所述,我想创建一个函数,它将采用多维数组a和数字B,最终返回a中与B最接近的数字。如果数字B在a中,则返回它。如果A中有两个数字与B的距离相等,则通过逐行计数选择第一个数字 这是我目前掌握的代码: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)).
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