使用 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
较长的 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])
我们可以用where
或argmin
找到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])
我有两个不同长度的占星表::
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
较长的 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])
我们可以用where
或argmin
找到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])