NumPy' ValueError:元组的大小必须与字段数匹配。'

时间:2015-02-14 21:10:48

标签: python numpy

我有一个解析json web服务的脚本,并使用解析字段添加到Esri文件地理数据库,在我的脚本末尾收到错误。不确定错误File "C:/Python27/ArcGIS10.2/websocket-client-0.23.0/websocket-client-0.23.0/examples/JSONSerializer.py", line 43, in <module> narr = numpy.array([vehicles], ndtype) ValueError: size of tuple must match number of fields.是什么意思。

脚本:

import json
import jsonpickle
import requests
import arcpy
import numpy

fc = "C:\MYLATesting.gdb\MYLA311"
if arcpy.Exists(fc):
  arcpy.Delete_management(fc)

f = open('C:\Users\Administrator\Desktop\myla311.json', 'r')

data = jsonpickle.encode( jsonpickle.decode(f.read()) )

url = "https://myla311test.lacity.org/myla311router/mylasrbe/1/QuerySR"
headers = {'Content-type': 'text/plain', 'Accept': '/'}

r = requests.post(url, data=data, headers=headers)
sr = arcpy.SpatialReference(4326)

decoded = json.loads(r.text)

SRAddress =  decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['SRAddress']
latitude = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['Latitude']
longitude =  decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['Longitude']

a = {"items":[{SRAddress, latitude, longitude}]}


ndtype = numpy.dtype([
    ('SRAddress', 'S16'),
    ('latitude', 'F48'),
    ('longitude', 'F48')

])

vehicles = []
for item in a['items']:
    vehicles.append(tuple(unicode(item[k] for k in ndtype.names)))

narr = numpy.array([vehicles],  ndtype)
arcpy.da.NumPyArrayToFeatureClass(narr, fc, ['longitude', 'latitude'], sr)


print a.keys()

# parsed_json = json.dumps(decoded, sort_keys=True, indent=4)

# print json.dumps(decoded, sort_keys=True, indent=4)

1 个答案:

答案 0 :(得分:3)

narr = numpy.array([vehicles],  ndtype)

表示创建一个数组,使用ndtype作为dtype定义,使用[vehicles]作为数据。 ndtype定义了fields

[vehicles]那么应该是一个元组列表,每个元组应该有3个项目,例如[(address1, lat1, lon1)][(a1,la1,lo1), (a2,la2,lo2) ....]

我认为您需要显示vehicles的值,甚至[vehicles],以确保符合此模式。 a有此数据。但vehicles是从[]开始创建的,并附加到[vehicles]。这意味着它已经是一个列表。 vehicles是列表的列表,而不是元组列表。

在不尝试运行代码的情况下,假设narr = numpy.array(vehicles, ndtype) 已经是必需的元组列表,此更改可能会起作用。

[vehicle]

你的''.join(x[0]) '<generator object <genexpr> at 0x0D5A3D00>' 被剥夺了:

In [20]: item={'1':'one','2':'two','3':'three'}
In [21]: unicode(item[k] for k in item)
Out[21]: '<generator object <genexpr> at 0xb438e02c>'

例如:

item

我认为你想要的是(假设In [33]: item={'1':b'one','2':b'two','3':b'three'} In [34]: tuple(item[k].decode() for k in item) Out[34]: ('three', 'two', 'one') 值是字节字符串):

{'items': [set([u'-118.252968', u'34.064937', u'1200 W TEMPLE ST, 90026'])]}

{SRAddress, latitude, longitude}

内部结构是一个集合,而不是字典。它由以下产生:

item[k]

我很惊讶SRAddress = u'1200 W TEMPLE ST, 90026' latitude=u'34.064937' longitude=u'-118.252968' # make a dictionary, not a set a = {"items":[{'SRAddress':SRAddress, 'latitude':latitude, 'longitude':longitude}]} vehicles=[] for item in a['items']: vehicles.append(tuple(item[k] for k in ndtype.names)) # [('1200 W TEMPLE ST, 90026', '34.064937', '-118.252968')] np.array(vehicles, ndtype) 有效,因为集合不支持索引。

但是让我们尝试用这些数据构建你的数组:

TypeError: a float is required

但最后会产生错误:latitude。那是因为vehicles是一个字符串,但是ndtype指定了一个浮点数。

构建vehicles = [(SRAddress, float(latitude), float(longitude))] np.array(vehicles, ndtype) 的一种较短方法是(仍然可以迭代);

array([(b'1200 W TEMPLE ST', (34.064937591552734+0j), (-118.25296783447266+0j))], 
  dtype=[('SRAddress', 'S16'), ('latitude', '<c8'), ('longitude', '<c8')])

但这会产生另一个问题:

F48

我认为你不想要float dtype。可能是f48,{{1}},也可能是字符串。