我有一个格式如下的csv文件:
Image Id,URL,Latitude,Longitude
17609472165,https://farm8.staticflickr.com/7780/17609472165_c44d9b5a0e_q.jpg,48.843226,2.31805
11375512374,https://farm6.staticflickr.com/5494/11375512374_66a4d9af6c_q.jpg,48.844166,2.376
24768920940,https://farm2.staticflickr.com/1571/24768920940_634cc06f43_q.jpg,48.844619,2.395897
9411072065,https://farm8.staticflickr.com/7368/9411072065_5e2083a32e_q.jpg,48.844666,2.3725
9996916356,https://farm3.staticflickr.com/2807/9996916356_640c493020_q.jpg,48.844666,2.3725
24281266199,https://farm2.staticflickr.com/1623/24281266199_bf63e25c23_q.jpg,48.844925,2.389616
我想导入此文件,并且对于文件中的每一行,将点lat和lon附加到2D数组。我已经尝试了以下代码并且它无法正常工作(或打印任何东西)并且正在给出错误“ValueError:除了连接轴之外的所有输入数组维度必须完全匹配”
import numpy
data = open('dataset_import_noaddress', 'r')
A = []
for line in data:
fields = line.strip().split(',')
lat = fields[2]
lon = fields[3]
print lat
print lon
newrow = [lat, lon]
A = numpy.vstack([A, newrow])
任何人都可以建议为什么这不起作用,甚至更好地建议一个更好的方法来实现同样的事情。谢谢!
答案 0 :(得分:2)
首先,您通常希望使用with open(filename, 'r') as ...:
格式。其中一个原因是,如果遇到错误,文件将自动关闭。
通常使用csv.reader来读取Python中的csv文件(尽管如果使用Pandas,也可以使用pd.read_csv(...)读取表格)。然后,您需要使用for line in reader:
迭代读取器。
您将获得单个变量并创建中间列表,每行使用numpy.vstack。将所有内容聚合为列表然后在整个列表中调用vstack会更有效。
A.append(line[2:4])
从给定行的列表中获取第三和第四项(例如[48.843226,2.31805])并将其附加到更大的列表A.首先应确保该行至少有四个值追加,跟踪坏线。
一旦构建了A,就可以调用vstack。
import csv
with open(filename, 'r') as f:
A = []
bad_lines = []
reader = csv.reader(f)
for line in reader:
if len(line) == 4:
A.append(line[2:4])
else:
bad_lines.append(line)
A = np.vstack(A)
答案 1 :(得分:1)
所以,基本上你想要来自csv文件的lat和long数据,是吗?我建议你使用pandas'
read_csv()
,这样就不需要逐行循环文件了。 Pandas可以同时处理所有列。
import pandas as pd
file_ = pd.read_csv("dataset_import_noaddress", sep = ',')
A = np.array(file_[["Latitude", "Longitude"]])
print A
array([[ 48.843226, 2.31805 ],
[ 48.844166, 2.376 ],
[ 48.844619, 2.395897],
[ 48.844666, 2.3725 ],
[ 48.844666, 2.3725 ],
[ 48.844925, 2.389616]])
答案 2 :(得分:1)
您想要将每个行纬度,经度读取到csv到矩阵中。所以基本上读了,它删除了前2列
<强>代码强>
import numpy as np
input = np.genfromtxt(open("dataset.csv","rb"),delimiter=",", skip_header=1)
A = np.delete(input, [0,1], 1)
print(A)
它只是读取csv所有非浮点值都转换为nan。然后用np.delete
删除前两列<强>输出强>
[[ 48.843226 2.31805 ]
[ 48.844166 2.376 ]
[ 48.844619 2.395897]
[ 48.844666 2.3725 ]
[ 48.844666 2.3725 ]
[ 48.844925 2.389616]]