将numpy.ndarray转换为列表(Python)
我正在使用Esri开发的一个函数,目的是从一个空间表的整数列中获取值的列表(即使在非空间表上运行这个函数,结果也是一样的)。根据帮助文档,我应该得到一个NumPy结构化数组。但在运行这个函数后,我得到了一个numpy数组。我用这种格式打印出来:
in_table = r"C:\geodb101@server.sde\DataTable" #
data = arcpy.da.TableToNumPyArray(in_table, "Field3")
print data
在我的开发环境中,这样打印出来的结果是(从IDE解释器复制粘贴过来的):
[(20130825,) (20130827,) (20130102,)]
我运行的是:
allvalues = data.tolist()
得到的结果是:
[(20130825,), (20130827,), (20130102,)]
按照评论中的建议,运行 data.reshape(len(data)).tolist()
也得到了相同的结果。
使用 type()
查看类型时,第一次得到的是 <type 'numpy.ndarray'>
,第二次得到的是 <type 'list'>
。我希望我的输出列表能以另一种格式显示,比如 [20130825, 20130827, 20130102]
。我哪里做错了,或者我还应该做些什么才能得到这个指定格式的输出列表呢?
1 个回答
我有一个可能的解决办法,不过我不太确定它是否有效,因为我搞不清楚你是怎么把元组放进数组里的(我尝试创建元组数组时,发现元组变成了数组)。无论如何,试试这个方法吧:
my_list = map(lambda x: x[0], my_np_array_with_tuples_in_it)
这个方法假设你处理的是你上面提到的单元素元组。就像我说的,当我尝试重现你的情况时,numpy做了一些我不太明白的转换(我对numpy不是很精通)。
希望这能帮到你。
更新:刚看到新的编辑,不确定我的回答是否还适用。
更新 2:很高兴这个方法有效,这里再多说一点。
Lambda其实就是一种内联函数,这种写法在很多编程语言中都很常见。它本质上是一个临时的、匿名的函数。你也可以这样做:
def my_main_func():
def extract_tuple_value(tup):
return tup[0]
my_list = map(extract_tuple_value, my_np_array_with_tuples_in_it)
但正如你所看到的,使用lambda的版本更简洁。我最开始例子中的“x”相当于更详细例子中的“tup”。
Lambda表达式通常只用于非常简单的操作,基本上是一行逻辑,这就是返回的内容(没有明确的返回语句)。
更新 3:和朋友聊过后,做了一些研究,列表推导绝对是更好的选择(见 Python 列表推导与 Map)。
根据acushner的评论,你也可以选择这个方法:
my_list = [tup[0] for tup in my_np_array_with_tuples_in_it]