使用numpy在哪里找到数组的最小值

时间:2018-11-06 19:46:52

标签: python numpy where astropy

我有两个长度不同的天文表:

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

想法?

2 个答案:

答案 0 :(得分:3)

我们可以使用以下方法创建增量列表:

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

然后我们可以使用以下方法计算delta最小的索引:

idx = np.argmin(delta)

然后我们可以通过以下方式获得相应的值:

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

请注意,如果在某些地方a大于b,则变化量将为负,这可以算作最小值。如果要获得差异的“绝对值”,则应添加np.abs(..)

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

答案 1 :(得分:0)

确定通过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

使用a对较长的delta进行布尔掩码会产生此错误:

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])

我们可以使用dmwhere找到argmin的索引。 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])