Построчный центр масс в кадре данных и умножение каждого столбца на разную массу - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь вычислить центр масс 20 объектов, каждый из которых имеет свою собственную массу.

Эти объекты представлены в кадре данных cm_x, а связанные с ними массы - в списке . Ниже для экономии места я показываю пример всего 3 из этих 20 объектов. Каждый объект имеет координату x, y, z, но я просто покажу x, а затем могу применить ту же технику к остальным. Ниже приведен заголовок фрейма данных.

bar_head_x  bar_hip_centre_x    bar_left_ankle_x
0   -203.3502   -195.4573   -293.262
1   -203.4280   -195.4720   -293.251
2   -203.4954   -195.4675   -293.248
3   -203.5022   -195.9193   -293.219
4   -203.5014   -195.9092   -293.328

m_head = 0.081
m_hipc = 0.139
m_lank = 0.0465
m = [m_head,m_hipc,m_lank] 

Я видел в другом аналогичном вопросе, кто-то предложил этот метод, однако он не включает массы, и именно здесь у меня возникла проблема:

def series_sum(pd_series):
    return np.sum(np.dot(pd_series.values, np.asarray(range(1, len(pd_series)+1)))/np.sum(pd_series))

cm_x.apply(series_sum, axis=1)

В основном я хочу, чтобы каждая строка имела связанный центр масс, используя формулу для центра масс sum(x_i * m_i) / sum(m_i).

Желаемым результатом будет новый столбец в кадре данных, например:

cm_x
0   -214.92
1   ...
2   ...
3   ...
4   ...

Любая помощь?

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Если я правильно понял, вы можете вычислить нужный столбец следующим образом:

>>> df.mul(m).sum(axis=1)/sum(m)
0   -214.921628
1   -214.951023
2   -214.968638
3   -215.201292
4   -215.214800
2 голосов
/ 29 мая 2020

Используйте DataFrame.dot и разделите на sum списка m:

s = df.dot(m).div(sum(m))
print (s)
0      -214.921628
1      -214.951023
2      -214.968638
3      -215.201292
4      -215.214800
7441   -245.078910
7442   -244.943961
7443   -244.806606
7444   -244.665285
7445   -244.533503
dtype: float64

При необходимости DataFrame добавьте Series.to_frame:

df1 = df.dot(m).div(sum(m)).to_frame('cm_x')
print (df1)
            cm_x
0    -214.921628
1    -214.951023
2    -214.968638
3    -215.201292
4    -215.214800
7441 -245.078910
7442 -244.943961
7443 -244.806606
7444 -244.665285
7445 -244.533503
...