使用 numpy where 查找数组的最小值

Using numpy where to find the minimum of an array

我有两个不同长度的占星表::

print(type(a),  len(a))
print(type(b),  len(b))
<class 'astropy.table.table.Table'> 457
<class 'astropy.table.table.Table'> 355

我正在寻找两个表之间的差异,其中(显然)仅对较小数量的数组有效::

delta = b - a 
print(type(delta),  len(delta))

然后我如何找到达到最小值的 'a' 和 'b' 的值::

 a[np.where(delta = delta.min())]
 b[np.where(delta = delta.min())]

后者看起来工作正常,但对于前者我得到:

IndexError: boolean index did not match indexed array along dimension 0; dimension is 457 but corresponding boolean dimension is 355

想法??

我们可以创建增量列表:

n = min(len(a), len(b))
delta = b[:n] - a[:n]

然后我们可以计算出 delta 最小的索引:

idx = np.argmin(delta)

然后我们可以得到对应的值:

am, bm = a[idx], b[idx]

注意,如果有地方a大于b,那么delta就是负数,这个可以算作最小值。如果你想要差异的 "absolute value",你应该添加 np.abs(..):

delta = np.abs(b[:n] - a[:n])

您确定使用 where 代码时出现此错误吗?该错误是由布尔运算产生的,即没有 'where'.

的 '==' 测试
In [375]: a = np.random.rand(100)
In [376]: b = np.random.rand(50)
In [377]: delta = a[:50]-b

In [380]: dm = delta.min()
In [381]: dm
Out[381]: -0.8017596490704487

较长的 adelta 的布尔掩码会产生此错误:

In [384]: a[delta == dm]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-384-d8a934874c2c> in <module>()
----> 1 a[delta == dm]

IndexError: boolean index did not match indexed array along dimension 0; dimension is 100 but corresponding boolean dimension is 50

In [386]: b[delta == dm]
Out[386]: array([0.91912184])

我们可以用whereargmin找到dm的索引。 where:

不会出现该错误
In [390]: np.argmin(delta)
Out[390]: 48
In [391]: np.where(delta == dm)
Out[391]: (array([48]),)
In [392]: a[np.where(delta == dm)]
Out[392]: array([0.11736219])