当我使用 shift 时重复操作,枚举?还是调试?
replicated operation when I use shift, enumerate? or a Debug?
我正在使用 python 来计算 2 列中行之间的差异。我使用函数减去 row1-row2,然后提升为平方并应用平方根来消除负号。然后函数移动到row2-row3 以此类推分隔一行,结果保存在一列中。下一步是计算 row1-row3 的减法,并保持该序列直到值结束...为了建立行之间的分隔,我构建了一个班次列表。显然我的清单没问题。我使用的数据如下:
df1
Out[44]:
TRACK_ID POSITION_X POSITION_Y POSITION_T
0 0 1 1 35.36
1 0 2 2 35.52
2 0 3 3 35.68
3 0 4 4 35.84
4 0 1 1 35.36
5 0 4 3 34.88
6 0 2 3 34.40
7 0 6 4 33.92
8 0 4 2 33.44
这是我的输出:
rad
Out[28]:
0 1 2 3 4 5 6 \
0 1.414214 2.828427 4.242641 0.000000 3.605551 2.236068 2.236068
1 1.414214 2.828427 1.414214 2.236068 1.000000 4.472136 4.472136
2 1.414214 2.828427 1.000000 1.000000 3.162278 1.414214 1.414214
3 4.242641 1.000000 2.236068 2.000000 2.000000 NaN NaN
4 3.605551 2.236068 5.830952 3.162278 NaN NaN NaN
5 2.000000 2.236068 1.000000 NaN NaN NaN NaN
6 4.123106 2.236068 NaN NaN NaN NaN NaN
7 2.828427 NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN
7 8
0 3.162278 NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
如何看到第 5 列和第 6 列相同,然后跳转到第 7 列中的正确系列
我的全部代码如下:
df1 = df[['TRACK_ID','POSITION_X','POSITION_Y','POSITION_T']].copy()
#Parameter input
N = df1.groupby('TRACK_ID').size()
max_time = N*(0.160)
frames = max_time/N
t_step=frames.item()
data = pd.DataFrame({'N':N,'max_time':max_time,'frames':frames})
print(data)
t=np.linspace(0.160, max_time.item(), N)
def radial(df1, coords=['POSITION_X', 'POSITION_Y']):
tau = t.copy()
shifts = np.divide(tau,t_step).astype(float)
print(shifts)
radials = list()
for i, shift in enumerate(shifts):
diffs = np.array(df1[coords] - df1[coords].shift(-shift))
sqdist = np.square(diffs).sum(axis=1)
r = np.sqrt(sqdist)
radials.append(r)
radial_disp = pd.DataFrame({'radials':radials})
return radials
radial_d = radial(df1, coords=['POSITION_X', 'POSITION_Y'])
radd = pd.DataFrame.from_records(radial_d) #horizontal
rad = radd.transpose() #vertical
当我打印轮班列表时,一切看起来都不错:
shifts
[ 1. 2. 3. 4. 5. 6. 7. 8. 9.]
所以,我不明白这是什么问题,在此先感谢!
好的,我想我已经在您的代码中找到了错误。
只需更改:
for i, shift in enumerate(shifts):
至:
for i, shift in enumerate(np.round(shifts,0)):
应该可以解决您的问题。
问题是您原来的 shifts 变量是浮动的,当您这样做时:
list(enumerate(shifts))
输出如下:
Out[1923]:
[(0, 1.0),
(1, 2.0),
(2, 3.0),
(3, 4.0),
(4, 5.0),
(5, 6.0),
(6, 6.9999999999999991),
(7, 8.0),
(8, 9.0)]
当 6.9999999999999991 转换为 int 时,它变成 6 而不是 7。
我正在使用 python 来计算 2 列中行之间的差异。我使用函数减去 row1-row2,然后提升为平方并应用平方根来消除负号。然后函数移动到row2-row3 以此类推分隔一行,结果保存在一列中。下一步是计算 row1-row3 的减法,并保持该序列直到值结束...为了建立行之间的分隔,我构建了一个班次列表。显然我的清单没问题。我使用的数据如下:
df1
Out[44]:
TRACK_ID POSITION_X POSITION_Y POSITION_T
0 0 1 1 35.36
1 0 2 2 35.52
2 0 3 3 35.68
3 0 4 4 35.84
4 0 1 1 35.36
5 0 4 3 34.88
6 0 2 3 34.40
7 0 6 4 33.92
8 0 4 2 33.44
这是我的输出:
rad
Out[28]:
0 1 2 3 4 5 6 \
0 1.414214 2.828427 4.242641 0.000000 3.605551 2.236068 2.236068
1 1.414214 2.828427 1.414214 2.236068 1.000000 4.472136 4.472136
2 1.414214 2.828427 1.000000 1.000000 3.162278 1.414214 1.414214
3 4.242641 1.000000 2.236068 2.000000 2.000000 NaN NaN
4 3.605551 2.236068 5.830952 3.162278 NaN NaN NaN
5 2.000000 2.236068 1.000000 NaN NaN NaN NaN
6 4.123106 2.236068 NaN NaN NaN NaN NaN
7 2.828427 NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN
7 8
0 3.162278 NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
如何看到第 5 列和第 6 列相同,然后跳转到第 7 列中的正确系列
我的全部代码如下:
df1 = df[['TRACK_ID','POSITION_X','POSITION_Y','POSITION_T']].copy()
#Parameter input
N = df1.groupby('TRACK_ID').size()
max_time = N*(0.160)
frames = max_time/N
t_step=frames.item()
data = pd.DataFrame({'N':N,'max_time':max_time,'frames':frames})
print(data)
t=np.linspace(0.160, max_time.item(), N)
def radial(df1, coords=['POSITION_X', 'POSITION_Y']):
tau = t.copy()
shifts = np.divide(tau,t_step).astype(float)
print(shifts)
radials = list()
for i, shift in enumerate(shifts):
diffs = np.array(df1[coords] - df1[coords].shift(-shift))
sqdist = np.square(diffs).sum(axis=1)
r = np.sqrt(sqdist)
radials.append(r)
radial_disp = pd.DataFrame({'radials':radials})
return radials
radial_d = radial(df1, coords=['POSITION_X', 'POSITION_Y'])
radd = pd.DataFrame.from_records(radial_d) #horizontal
rad = radd.transpose() #vertical
当我打印轮班列表时,一切看起来都不错:
shifts
[ 1. 2. 3. 4. 5. 6. 7. 8. 9.]
所以,我不明白这是什么问题,在此先感谢!
好的,我想我已经在您的代码中找到了错误。
只需更改:
for i, shift in enumerate(shifts):
至:
for i, shift in enumerate(np.round(shifts,0)):
应该可以解决您的问题。
问题是您原来的 shifts 变量是浮动的,当您这样做时:
list(enumerate(shifts))
输出如下:
Out[1923]:
[(0, 1.0),
(1, 2.0),
(2, 3.0),
(3, 4.0),
(4, 5.0),
(5, 6.0),
(6, 6.9999999999999991),
(7, 8.0),
(8, 9.0)]
当 6.9999999999999991 转换为 int 时,它变成 6 而不是 7。