将numpy.ndarray转换为列表(Python)

1 投票
1 回答
10124 浏览
提问于 2025-04-17 22:06

我正在使用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 个回答

4

我有一个可能的解决办法,不过我不太确定它是否有效,因为我搞不清楚你是怎么把元组放进数组里的(我尝试创建元组数组时,发现元组变成了数组)。无论如何,试试这个方法吧:

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]

撰写回答