Используя numpy, где найти минимум массива - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть две таблицы астропий разной длины:

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[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 голосов
/ 06 ноября 2018

Вы уверены, что получаете эту ошибку с кодом 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])

Мы можем найти индекс dm с where или с 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])
0 голосов
/ 06 ноября 2018

Мы можем создать список дельт с:

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...