Как я могу уменьшить массив на основе ключа, а не оси? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть массив с 2 столбцами. Второй столбец представляет ключи, на которые я хочу уменьшить.

>>> x
array([[0.1 , 1.  ],
       [0.25, 1.  ],
       [0.45, 0.  ],
       [0.55, 0.  ]])

Я хочу суммировать все значения, которые разделяют ключ, как это.

>>>sum_key(x)
array([[0.35 , 1.  ],
       [1.0, 0.  ]])

Это похоже наэто относительно универсальная задача, но я не могу найти для нее подходящего имени или обсудить ее. Есть идеи?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019
import numpy as np
import pandas as pd

data = np.array([[0.1 , 1.  ],
       [0.25, 1.  ],
       [0.45, 0.  ],
       [0.55, 0.  ]])

df = pd.DataFrame(data)

gr = df.groupby([1])[0].agg('sum')

print(gr.keys().values)

data1 = np.array([[gr[k],k] for k in gr.keys().values])
print(data1)
0 голосов
/ 08 ноября 2019

Если индексы (ключи) являются целыми числами по возрастанию (или могут быть легко преобразованы, как в вашем случае), наиболее удобный способ - использовать np.bincount .

import numpy as np

x = np.array([[0.1 , 1.  ],
             [0.25, 1.  ],
             [0.45, 0.  ],
             [0.55, 0.  ]])

v = x[:, 0]
i = x[:, 1]

counts = np.bincount(i.astype(int), v)

print(counts)

# returns [1.   0.35]
0 голосов
/ 08 ноября 2019

Это немного усложняется, но оно должно работать:

import numpy as np
x = np.array([[0.1 , 1.  ],
       [0.25, 1.  ],
       [0.45, 0.  ],
       [0.55, 0.  ]])
keys = x[:,1]
values = x[:,0]
keys_unique = np.unique(keys)
print([[sum(values[keys == k]), k] for k in keys_unique])

Вывод:

[[1.0, 0.0], [0.35, 1.0]]
...