индекс numpy два массива - PullRequest
       1

индекс numpy два массива

0 голосов
/ 29 декабря 2018

У меня есть два массива.Я хотел бы использовать один из них в качестве ссылки для второго, как я могу это сделать?У меня есть следующий массив A:

A = np.array([[1.00, 0.0, 1.03, 1.18],
          [0.0, 1.58, 0.0, 7.59],
          [1.00, 1.22, 1.07, 1.03]])

Кроме того, у меня есть массив B:

B = np.array([[1.00, 2.00, 27.00, 10.00],
          [3.00, 9.00, 6.00, 2.00],
          [2.00, 6.00, 4.00, 15.00]])

Мне нужно определить положение / местоположение ([i,j]) всех нулейв столбце A by (если вы переходите от массива к dataframe, просто чтобы уточнить мою точку зрения), затем переходите к B и выполняете определенную операцию (сумму или любую другую математическую формулу) в том же [i,j].Я не знаю, как это сделать с массивами.

Что я делал до сих пор: я мог бы решить эту задачу, построив новый массив (C), в котором есть i-столбцы (рассматриваемые как фрейм данных) из A и B, затемудалил строки, где первый столбец равен нулю, и выполнил операцию (в последовательности цикла).Я знаю, что это не самый эффективный способ сделать это.Я также попытался изменить массив на dataframe (затем применил loc), но я предпочитаю использовать массив для манипулирования данными.Наконец, я попытался this , но появляется следующее сообщение arrays used as indices must be of integer (or boolean) type

Я хотел бы изучить новый подход к моей задаче.Большое спасибо.

1 Ответ

0 голосов
/ 29 декабря 2018

Решение: используйте замаскированный массив

Учитывая форму ваших A и B, самый простой способ выполнить необходимые вычисления - через замаскированный массив .Сначала вы создаете новый замаскированный массив с данными из B, маскируемый во всех местах, где A==0:

marr = np.ma.masked_array(B, A==0)
print(f'the masked array looks like\n{marr}\n')

Выход:

the masked array looks like
[[1.0 -- 27.0 10.0]
 [-- 9.0 -- 2.0]
 [2.0 6.0 4.0 15.0]]

работает на всехстолбцы в замаскированном массиве сразу без цикла

Затем вы можете выполнять различные операции (sum, mean, cumprod и т. д.) сразу для всех замаскированных столбцов, например:

colsums = marr.sum(axis=0)
colmeans = marr.mean(axis=0)

print(f'sum of each masked column\n{colsums}\n')
print(f'the mean of each masked column\n{colmeans}\n')

Вывод:

sum of each masked column
[3.0 15.0 31.0 27.0]

the mean of each column
[1.5 7.5 15.5 9.0]

Обратите внимание, что среднее значение для первого столбца рассчитывается как (1.0 + 2.0)/2.Метод mean полностью игнорирует замаскированные элементы, так же, как в первоначальном подходе удаления строки OP.

цикл по замаскированным столбцам

Если вы хотите выполнить некоторые вычислениядля которого нет встроенного метода Numpy, например sum или mean, вместо этого вы можете перебирать маскированные столбцы и работать с каждым по очереди, как показано ниже:

colmeans = [col.mean() for col in marr.T]
print(f'the result of iterating over the masked columns and taking the mean of each\n{colmeans}\n')

Вывод:

the result of iterating over the masked columns and taking the mean of each
[1.5, 7.5, 15.5, 9.0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...