Не могу понять «не могу умножить последовательность на не-int типа «float»»

#python

Вопрос:

Я пытаюсь преобразовать ускоренные данные в гравитацию, но в строке 5 появляется ошибка»не удается умножить последовательность на не-int типа «float»»

 1. l = []
2. for i in df3.values:
3.   m = []
4.   for x in i:
5.     x = ((2*8)/(pow(2,14)))*x
6.     m.append(x)
7.   l.append(m)
8. df3 = pd.DataFrame(l)
9. print(df3)
 

файл csv содержит данные ускорения (вектор x, y, z) в битах, и я пытаюсь преобразовать их в ускорение,
пример:

 76,-697,-279
15,-174, -90
-53,-568,-306
48,-675,-254
1,-176, -81
-84,-613,-271
-2,-668,-221
-10,-180, -77
 

Комментарии:

1. почему вы используете одну и ту же переменную для своего итератора for x in i , а затем используете ее для присвоения ей некоторых значений? (и умножьте на это)

2. вы, вероятно, захотите использовать numpy.array для своих промежуточных массивов не собственный список Python, который не будет хорошо себя вести с такими вещами, как умножение (где он создает мягкие копии).

3. Зачем пересчитывать эти константы? Это не так дорого, но все же, почему бы просто не использовать 0.0009765625 ? Кроме того, что именно ты пытаешься сделать? Вы явно применяете какие-то вычисления к фрейму данных. Можете ли вы предоставить нам образец фрейма данных? Я не вижу причин использовать здесь вложенный цикл for.

4. Вы пытаетесь получить величину векторов ускорения?

Ответ №1:

Делая некоторые предположения, возможно, у вас есть данные акселерометра, как здесь

Вместо использования цикла вы можете сделать это напрямую с помощью векторизованной математики

 df = df.assign(gravity=(df["source"] / 1024))
 
 >>> df = pd.DataFrame({'source': [200, 10000, 20000, 900]})
>>> df.assign(gravity=df['source']/1024)
   source    gravity
0     200   0.195312
1   10000   9.765625
2   20000  19.531250
3     900   0.878906
 

Комментарии:

1. Почему бы просто не разделить на 1024?

2. ах, промежуточная математическая оплошность

Ответ №2:

Не совсем понятно, о чем вы просите, но, похоже, вам нужна величина этих векторов ускорения? В таком случае используйте df.apply(np.linalg.norm, axis=1) , вот так:

 In [3]: df
Out[3]:
    x    y    z
0  76 -697 -279
1  15 -174  -90
2 -53 -568 -306
3  48 -675 -254
4   1 -176  -81
5 -84 -613 -271
6  -2 -668 -221
7 -10 -180  -77

In [4]: df.apply(np.linalg.norm, axis=1)
Out[4]:
0    754.603207
1    196.471372
2    647.355389
3    722.803569
4    193.747258
5    675.474648
6    703.611398
7    196.033160
dtype: float64