Условное среднее в numy массивах? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть массив NumPy с именем «Расстояния», который выглядит следующим образом:

[[ 5.  1.  1.  1.  2.  1.  3.  1.  1.  1.]
[ 5.  4.  4.  5.  7. 10.  3.  2.  1.  1.]
 [ 3.  1.  1.  1.  2.  2.  3.  1.  1.  0.]
 [ 6.  8.  8.  1.  3.  4.  3.  7.  1.  1.]
 [ 4.  1.  1.  3.  2.  1.  3.  1.  1.  1.]
 [ 8. 10. 10.  8.  7. 10.  9.  7.  1.  1.]
 [ 1.  1.  1.  1.  2. 10.  3.  1.  1.  0.]
 [ 2.  1.  2.  1.  2.  1.  3.  1.  1.  0.]
 [ 2.  1.  1.  1.  2.  1.  1.  1.  5.  2.]
 [ 4.  2.  1.  1.  2.  1.  2.  1.  1.  1.]]

Я хочу создать новый массив NumPy 3 * 9, взяв среднее значение так:

  1. Если последний столбец равен 0, определите массив c0 (1 * 9), который является средним значением всех таких строк, где последний столбец равен 0, где каждый столбец является средним значением столбцов из таких строк.
  2. Если последний столбецравен 1, определите массив c1 (1 * 9), который является средним для всех таких строк, где последний столбец равен 1, где каждый столбец является средним для столбцов из таких строк.
  3. Если последний столбец равен 2, определитемассив c2 (1 * 9), который является средним для всех таких строк, где последний столбец равен 2, где каждый столбец является средним для столбцов из таких строк.

После этого я делаю hstack, чтобы получить finalМассив 3 * 9.Я уверен, что это долгий подход, но тем не менее неправильный.

код:

c0=distances.mean(axis=1)

final = np.hstack((c0,c1,c2))

Делая это, я получаю массив 1 * 10, где каждый столбец является средним для каждого столбца из массива расстоянийОднако я не могу найти способ сделать это при условии, которое принимает среднее значение, только когда последний столбец строк равен только 0?

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

С pandas

Было бы просто с pandas -

import pandas as pd

df = pd.DataFrame(distances)
df_out = df.groupby(df.shape[1]-1).mean()
df_out['ID'] = df_out.index
out = df_out.values

С NumPy

Использование пользовательской функции

Для NumPy-специфического мы можем использовать groupbycol (выполнить суммирование по группам) и, следовательно, решить наш случай, например, -

sums  = groupbycol(distances, assume_sorted_col=False, colID=-1)
out = sums/np.bincount(distances[:,-1]).astype(float)[:,None]

С matrix-multiplication

mask = distances[:,-1,None] == np.arange(distances[:,-1].max()+1)
out = mask.T.dot(distances)/mask.sum(0)[:,None].astype(float)
0 голосов
/ 11 апреля 2019

Я смог сделать это так:

c0= (distances[distances[:,-1] == 0][:,0:9]).mean(axis=0)
c1 = (distances[distances[:,-1] == 1][:,0:9]).mean(axis=0)
c2 = (distances[distances[:,-1] == 2][:,0:9]).mean(axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...