Как объединить столбцы массива, которые имеют значения Nan? - PullRequest
0 голосов
/ 12 февраля 2019

Я новичок в Python, и у меня есть некоторые проблемы с объединением данных.

Я хочу разобраться с моими данными, полностью отбрасывая столбцы со значениями Nan.

Но в большинстве моих данных индексы значений Nan отличаются.

Например,

data1 = np.array([1, 2, np.nan, 4, 5])
data2 = np.array([1, np.nan, 3, 4, 6])
data3 = np.array([np.nan, 2, 3, 4, 7])

ind_1 = np.where(~np.isnan(data1))
ind_2 = np.where(~np.isnan(data2))
ind_3 = np.where(~np.isnan(data3))

-----

data1_out = data1[ind_1[0]]  # array([ 1., 2., 4., 5.])
data2_out = data2[ind_2[0]]  # array([ 1., 3., 4., 6.])
data3_out = data3[ind_3[0]]  # array([ 2., 3., 4., 7.])

, но мне нужны массивы типа

data1_out = array([ 4., 5.])
data2_out = array([ 4., 6.])
data3_out = array([ 4., 7.])

.Я думаю, что объединенный массив, такой как

ind_c = intersection(ind_1, ind_2, ind_3)
data1_out = data1[ind_c[0]]

, решит проблему!

, который является общим выводом для других, поэтому, если индекс одного набора данных имеет значение Nan, он влияет на все тот же индексдругого набора данных.

Я не могу найти простой способ сделать это.Любой совет?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Объедините все массивы в двумерный массив:

z = np.stack([data1, data2, data3])

Найдите столбцы, отличные от nan:

columns = ~np.isnan(z).any(axis=0)

Выберите данные:

data1, data2, data3 = z[:, columns]
#array([4., 5.])
#....
0 голосов
/ 12 февраля 2019

Есть очень простой способ сделать это.Вместо использования where для получения числовых индексов придерживайтесь логической маски, генерируемой isnan.Маски легче комбинировать и с ними часто проще работать и другими способами, не говоря уже о том, что это экономит вам шаг на массив.

mask_1 = ~np.isnan(data1)
mask_2 = ~np.isnan(data2)
mask_3 = ~np.isnan(data3)

Теперь вы можете объединять маски в одну, используя простые логические операциии примените результат к каждому из массивов:

mask = mask_1 & mask_2 & mask_3
data1_out = data1[mask] 
data2_out = data2[mask] 
data3_out = data3[mask] 

Теперь каждый раз, когда вы обнаруживаете, что работаете с массивами одинаковой формы, именуемыми как x1, x2, x3 и т. д.,вам, вероятно, нужен только один массив с дополнительным измерением.В 99% случаев это облегчит вашу жизнь:

data = np.array([[1, 2, np.nan, 4, 5],
                 [1, np.nan, 3, 4, 6],
                 [np.nan, 2, 3, 4, 7]])
mask = ~np.isnan(data).any(axis=0)
data_out = data[np.arange(data.shape[0]).reshape(-1, 1), mask]

any применяет | ко всем элементам.np.arange(data.shape[0]).reshape(-1, 1) создает вектор столбца, который заставляет маску 1D быть примененной к каждой строке посредством широковещания.

Конечно, этот подход основан на том, что в каждой строке имеется равное количество NaN.Если это не так, вам придется использовать отдельные массивы.

0 голосов
/ 12 февраля 2019
>>> truth = ~np.isnan(data1) & ~np.isnan(data2) & ~np.isnan(data3)
>>> data1[truth]
[4. 5.]
>>> data2[truth]
[4. 5.]
>>> data3[truth]
[4. 5.]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...