Numpy Aggregate Rows and Sum
up vote
1
down vote
favorite
I have a Numpy matrix:
M = [[55, 5],
[56, 3],
[57, 7],
[58, 9],
[59, 3],
[60, 8],
[61, 1]]
I want to aggregate by group_size (for example into 3 groups):
group_size = math.ceil(M.size/groups) # math.ceil(7/3) = 3
Each aggregated row has a left value being the first left value from the group, and the right value being the sum of all right values from the group.
Expected output:
R = [[55, 15], # 55 first left column value of first group, 15 sum of all right values in group
[58, 20], # 58 first left column value of second group, 20 sum of all right values in group
[61, 1]] # Third group consist only of one row, remainder
Is there an efficient way to solve this with Numpy without looping?
python pandas numpy
add a comment |
up vote
1
down vote
favorite
I have a Numpy matrix:
M = [[55, 5],
[56, 3],
[57, 7],
[58, 9],
[59, 3],
[60, 8],
[61, 1]]
I want to aggregate by group_size (for example into 3 groups):
group_size = math.ceil(M.size/groups) # math.ceil(7/3) = 3
Each aggregated row has a left value being the first left value from the group, and the right value being the sum of all right values from the group.
Expected output:
R = [[55, 15], # 55 first left column value of first group, 15 sum of all right values in group
[58, 20], # 58 first left column value of second group, 20 sum of all right values in group
[61, 1]] # Third group consist only of one row, remainder
Is there an efficient way to solve this with Numpy without looping?
python pandas numpy
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I have a Numpy matrix:
M = [[55, 5],
[56, 3],
[57, 7],
[58, 9],
[59, 3],
[60, 8],
[61, 1]]
I want to aggregate by group_size (for example into 3 groups):
group_size = math.ceil(M.size/groups) # math.ceil(7/3) = 3
Each aggregated row has a left value being the first left value from the group, and the right value being the sum of all right values from the group.
Expected output:
R = [[55, 15], # 55 first left column value of first group, 15 sum of all right values in group
[58, 20], # 58 first left column value of second group, 20 sum of all right values in group
[61, 1]] # Third group consist only of one row, remainder
Is there an efficient way to solve this with Numpy without looping?
python pandas numpy
I have a Numpy matrix:
M = [[55, 5],
[56, 3],
[57, 7],
[58, 9],
[59, 3],
[60, 8],
[61, 1]]
I want to aggregate by group_size (for example into 3 groups):
group_size = math.ceil(M.size/groups) # math.ceil(7/3) = 3
Each aggregated row has a left value being the first left value from the group, and the right value being the sum of all right values from the group.
Expected output:
R = [[55, 15], # 55 first left column value of first group, 15 sum of all right values in group
[58, 20], # 58 first left column value of second group, 20 sum of all right values in group
[61, 1]] # Third group consist only of one row, remainder
Is there an efficient way to solve this with Numpy without looping?
python pandas numpy
python pandas numpy
asked 2 days ago
Franc Weser
1527
1527
add a comment |
add a comment |
4 Answers
4
active
oldest
votes
up vote
3
down vote
accepted
Here's one way with NumPy:
n = 3
x = M[::n, 0]
y = np.add.reduceat(M[:, 1], np.arange(0, M.shape[0], n))
R = np.vstack((x, y)).T
print(R)
array([[55, 15],
[58, 20],
[61, 1]])
add a comment |
up vote
3
down vote
pandas
solution should be use agg
with first
and sum
:
group_size = 3
df = pd.DataFrame(M).groupby(np.arange(len(M)) // group_size).agg({0:'first',1:'sum'})
print (df)
0 1
0 55 15
1 58 20
2 61 1
a = np.array(df.values.tolist())
print(a)
[[55 15]
[58 20]
[61 1]]
add a comment |
up vote
1
down vote
A solution using Python:
from operator import itemgetter
M = [[55, 5],
[56, 3],
[57, 7],
[58, 9],
[59, 3],
[60, 8],
[61, 1]]
it = (M[e:e+3] for e in range(0, len(M), 3))
print([[e[0][0], sum(map(itemgetter(1), e))] for e in it])
Output
[[55, 15], [58, 20], [61, 1]]
add a comment |
up vote
0
down vote
a = np.array([[2, 3],[5, 6],[7, 9]])
b = numpy.zeros(shape=(len(a[0])))
for i in a:
b=b+i
print(b)
2
An explanation, what a code does and how this addresses the problem in the question, rarely fails to improve an answer.
– blue-phoenox
2 days ago
add a comment |
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
Here's one way with NumPy:
n = 3
x = M[::n, 0]
y = np.add.reduceat(M[:, 1], np.arange(0, M.shape[0], n))
R = np.vstack((x, y)).T
print(R)
array([[55, 15],
[58, 20],
[61, 1]])
add a comment |
up vote
3
down vote
accepted
Here's one way with NumPy:
n = 3
x = M[::n, 0]
y = np.add.reduceat(M[:, 1], np.arange(0, M.shape[0], n))
R = np.vstack((x, y)).T
print(R)
array([[55, 15],
[58, 20],
[61, 1]])
add a comment |
up vote
3
down vote
accepted
up vote
3
down vote
accepted
Here's one way with NumPy:
n = 3
x = M[::n, 0]
y = np.add.reduceat(M[:, 1], np.arange(0, M.shape[0], n))
R = np.vstack((x, y)).T
print(R)
array([[55, 15],
[58, 20],
[61, 1]])
Here's one way with NumPy:
n = 3
x = M[::n, 0]
y = np.add.reduceat(M[:, 1], np.arange(0, M.shape[0], n))
R = np.vstack((x, y)).T
print(R)
array([[55, 15],
[58, 20],
[61, 1]])
answered 2 days ago
jpp
80.2k184695
80.2k184695
add a comment |
add a comment |
up vote
3
down vote
pandas
solution should be use agg
with first
and sum
:
group_size = 3
df = pd.DataFrame(M).groupby(np.arange(len(M)) // group_size).agg({0:'first',1:'sum'})
print (df)
0 1
0 55 15
1 58 20
2 61 1
a = np.array(df.values.tolist())
print(a)
[[55 15]
[58 20]
[61 1]]
add a comment |
up vote
3
down vote
pandas
solution should be use agg
with first
and sum
:
group_size = 3
df = pd.DataFrame(M).groupby(np.arange(len(M)) // group_size).agg({0:'first',1:'sum'})
print (df)
0 1
0 55 15
1 58 20
2 61 1
a = np.array(df.values.tolist())
print(a)
[[55 15]
[58 20]
[61 1]]
add a comment |
up vote
3
down vote
up vote
3
down vote
pandas
solution should be use agg
with first
and sum
:
group_size = 3
df = pd.DataFrame(M).groupby(np.arange(len(M)) // group_size).agg({0:'first',1:'sum'})
print (df)
0 1
0 55 15
1 58 20
2 61 1
a = np.array(df.values.tolist())
print(a)
[[55 15]
[58 20]
[61 1]]
pandas
solution should be use agg
with first
and sum
:
group_size = 3
df = pd.DataFrame(M).groupby(np.arange(len(M)) // group_size).agg({0:'first',1:'sum'})
print (df)
0 1
0 55 15
1 58 20
2 61 1
a = np.array(df.values.tolist())
print(a)
[[55 15]
[58 20]
[61 1]]
answered 2 days ago
jezrael
305k20238314
305k20238314
add a comment |
add a comment |
up vote
1
down vote
A solution using Python:
from operator import itemgetter
M = [[55, 5],
[56, 3],
[57, 7],
[58, 9],
[59, 3],
[60, 8],
[61, 1]]
it = (M[e:e+3] for e in range(0, len(M), 3))
print([[e[0][0], sum(map(itemgetter(1), e))] for e in it])
Output
[[55, 15], [58, 20], [61, 1]]
add a comment |
up vote
1
down vote
A solution using Python:
from operator import itemgetter
M = [[55, 5],
[56, 3],
[57, 7],
[58, 9],
[59, 3],
[60, 8],
[61, 1]]
it = (M[e:e+3] for e in range(0, len(M), 3))
print([[e[0][0], sum(map(itemgetter(1), e))] for e in it])
Output
[[55, 15], [58, 20], [61, 1]]
add a comment |
up vote
1
down vote
up vote
1
down vote
A solution using Python:
from operator import itemgetter
M = [[55, 5],
[56, 3],
[57, 7],
[58, 9],
[59, 3],
[60, 8],
[61, 1]]
it = (M[e:e+3] for e in range(0, len(M), 3))
print([[e[0][0], sum(map(itemgetter(1), e))] for e in it])
Output
[[55, 15], [58, 20], [61, 1]]
A solution using Python:
from operator import itemgetter
M = [[55, 5],
[56, 3],
[57, 7],
[58, 9],
[59, 3],
[60, 8],
[61, 1]]
it = (M[e:e+3] for e in range(0, len(M), 3))
print([[e[0][0], sum(map(itemgetter(1), e))] for e in it])
Output
[[55, 15], [58, 20], [61, 1]]
answered 2 days ago
Daniel Mesejo
7,6341821
7,6341821
add a comment |
add a comment |
up vote
0
down vote
a = np.array([[2, 3],[5, 6],[7, 9]])
b = numpy.zeros(shape=(len(a[0])))
for i in a:
b=b+i
print(b)
2
An explanation, what a code does and how this addresses the problem in the question, rarely fails to improve an answer.
– blue-phoenox
2 days ago
add a comment |
up vote
0
down vote
a = np.array([[2, 3],[5, 6],[7, 9]])
b = numpy.zeros(shape=(len(a[0])))
for i in a:
b=b+i
print(b)
2
An explanation, what a code does and how this addresses the problem in the question, rarely fails to improve an answer.
– blue-phoenox
2 days ago
add a comment |
up vote
0
down vote
up vote
0
down vote
a = np.array([[2, 3],[5, 6],[7, 9]])
b = numpy.zeros(shape=(len(a[0])))
for i in a:
b=b+i
print(b)
a = np.array([[2, 3],[5, 6],[7, 9]])
b = numpy.zeros(shape=(len(a[0])))
for i in a:
b=b+i
print(b)
answered 2 days ago
Mohammad reza Kashi
214
214
2
An explanation, what a code does and how this addresses the problem in the question, rarely fails to improve an answer.
– blue-phoenox
2 days ago
add a comment |
2
An explanation, what a code does and how this addresses the problem in the question, rarely fails to improve an answer.
– blue-phoenox
2 days ago
2
2
An explanation, what a code does and how this addresses the problem in the question, rarely fails to improve an answer.
– blue-phoenox
2 days ago
An explanation, what a code does and how this addresses the problem in the question, rarely fails to improve an answer.
– blue-phoenox
2 days ago
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53239224%2fnumpy-aggregate-rows-and-sum%23new-answer', 'question_page');
}
);
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password