我正在尝试定义一个函数,该函数接受汽车的两个输入,指令和操作,这是字符串列表,其中包含要打开的CSV文件的名称,其中包含数据(我无法使用csv库导入)。 csv文件包含以下格式的列中的数据:动作,时间,速度。例如N,10、10表示以10米每秒的速度向北移动10秒。那么位移将是向北100等。
说第一个instr1.csv文件包含(无标题):
it=iter(range(len(df.columns)))
df=df.rename(columns=lambda x: next(it))
最终,我想返回汽车的垂直和水平位移,然后返回numpy数组中的总距离。我一直努力尝试弄清楚动作何时是北,我将第二列和第三列相乘,将它们相乘,将其附加到列表中,然后创建一个要返回的numpy列表。
首先,我读取数据,遍历每一行以产生数据,然后创建具有dtypes的结构化数组(arrayInstructionsFile1)。
到目前为止,我得到的是:
0 1 2 3
0 col-a 97 98 99
1 col-b 34 35 36
2 col-c 24 25 26
现在使用这样的功能:
N, 10, 10
E, 10, 8
S, 10, 5
W, 10, 4
给出结构化数组:
import numpy as np
#import matplotlib.pyplot as plt #(plot numpy arrays later)
def car(instructions,actions):
instrucFile = instructions
newArrayFile1 = []
newArrayFile2 = []
lstNorth = []
for file in instrucFile[0:1]: #reads first csv file
with open(file) as filedata: #get data
arrayInstructionsFile1 = np.genfromtxt(file,delimiter=',',dtype=[('action','U1'),('time',float),('speed',float)],encoding=None,usecols=None)
for i in arrayInstructionsFile1: #loops each row to a list
newArrayFile1.append(i)
npArrInstrucDataFile1 = np.array(newArrayFile1) #prints structured array
print('File1 structured array = ',npArrInstrucDataFile1)
但是我很困惑,如何根据动作是N,E,S还是W告诉python将值放入一个新数组,然后将浮点数彼此相乘,这样我就可以返回所需的值numpy数组?
如您所见,我为此付出了很大的努力,因此,非常感谢您提供的任何帮助/指导,甚至提出更好的方法。我已经尽力解释了我为避免混淆所要做的一切,如果时间太长,对不起!
谢谢!
答案 0 :(得分:0)
如果我对您的理解正确,那么您的文件就像是一个简单的LOGO程序(https://en.wikipedia.org/wiki/Logo_(programming_language))
您可以按照以下方式“播放”“节目”:
1)定义x和y变量,一开始它们应该为零,这意味着“无位移”
2)确定方向(N,E,S,W)如何应用于XY坐标系,例如,北方向为正Y,南为负Y,东为正X,西为负X
3)对于每个动作,根据您在第2点的决定,检查应执行的操作。
如果操作为“ N”,则应将速度*时间添加到 y 变量中。 (其中速度和时间来自第二列和第三列)
y += speed * time
如果动作为“ W”,则从“ x”变量中减去速度*时间
x -= speed * time
“ E”和“ S”等
我的意思是说,您应该逐行浏览数据网格,并为每一行执行一个操作。例如:
for row in file1_structured_array:
action = row[0]
speed = float(row[1])
time = float(row[2])
if action == "N":
y += speed * time
elif action == "S":
...
elif action == "E":
...
elif action == "W":
...
4)执行此操作后,您将在 x 变量中具有水平位移,而在 y 变量中具有垂直位移。此外,您可以借助勾股定理找到距离。
5)此结果可以轻松地放入您需要的python或numpy数组中。