用列表推导索引?可能吗?

Posted

技术标签:

【中文标题】用列表推导索引?可能吗?【英文标题】:indexing with list comprehensions? Is it possible? 【发布时间】:2015-10-14 01:21:59 【问题描述】:

我现在这样做的方式似乎很笨拙。有没有更好的方法来索引这个数组?

这是有效的代码:

DEM = np.empty((number_of_DEM_files, DEMfile.shape[0], DEMfile.shape[1]), 'float')

for t in range(number_of_DEM_files):
      DEM[t] = np.load(DEM_filename_list[t])

我尝试用这样的列表推导来做到这一点:

DEM = np.load([DEM_filename_list[t] for t in range(number_of_DEM_files)])

但我得到一个语法错误。这可能吗?甚至有理由这样做还是和我已经得到的一样慢?有没有更好的办法?

编辑:

DEM_filename_list 如下所示:

DEM_filename_list = (D:/Documents/Data/grand_canyon_2015/03-11/dem1.npy,
                     D:/Documents/Data/grand_canyon_2015/03-11/dem2.npy,
                     D:/Documents/Data/grand_canyon_2015/03-11/dem3.npy,
                     etc)

第一行创建一个空的 3d 数组。最终,我试图在一个 3d 数组中加载和存储时间序列数组,以便您可以使用 DEM[t,i,j]

其中t是时间,i是行号,j是列号。

【问题讨论】:

DEM_filename_list的类型是什么? 不相关但DEM_filename_list[:number_of_DEM_files] 会与您的列表组合做同样的事情 number_of_DEM Files 中是否缺少下划线? 我不认为为此做一个简单的for 很笨拙,尽管我不明白第一行的作用。 DEM = [np.load(f) for f in DEM_filename_list] 怎么样?你想用来自不同文件的行值构建一个矩阵吗? 【参考方案1】:

这是一个可测试的示例,运行良好:

import numpy as np

a = np.array((1,2))
b = np.array((3,4))

with open('12', 'wb') as f:
    np.save(f,a)
with open('34', 'wb') as f:
    np.save(f,b)    

l = DEM_filename_list

DEM = [np.load(ll) for ll in l]

print DEM

输出:

[array([1, 2]), array([3, 4])]

或与您的注释一起呈现:

import numpy as np

DEM = [np.load(ll) for ll in DEM_filename_list]

print DEM

输出:

 DEM_files

更新:

不需要行:

DEM = np.empty((number_of_DEM_files))

【讨论】:

DEM 不再是一个 numpy 数组。您可能想做类似的事情:DEM = np.empty((2,2)); DEM[:] = [np.load(ll) for ll in l] 真的,我更新了,谢谢。请注意,正如我在更新中所写,在分配之前不需要任何操作。【参考方案2】:

我不确定 number_of_DEM_files 是否与 DEM_filename_list 有直接关系,我假设它是一对一的,并且 DEM_filename_list 是可迭代的(按名称),在这种情况下我会做这样的事情。

DEM = np.empty((number_of_DEM_files, DEMfile.shape[0], DEMfile.shape[1])

for i, t in enumerate(DEM_filename_list):
      DEM[i] = np.load(t)

DEM = [np.load(t) for t in DEM_filename_list]

【讨论】:

【参考方案3】:

您可以使用 enumerate 内置函数获取 (index, value) 的枚举对象并使用结果对中的索引。

如果性能是一个问题,您可以使用 numpy 枚举函数:ndenumerate。

【讨论】:

不要在 numpy 中这样做。这将导致您失去从矢量化中获得的所有性能提升。 您在 range 中获得与 enumerate 相似的性能:***.com/questions/11990105/…

以上是关于用列表推导索引?可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

mysql根据索引去修改数据,会走索引吗

用 Jquery 中另一个 html 列表的索引填充一个 html 列表

41个有关Python的小技巧

Python 列表查找,如何在列表中查找项目或者元素索引翻译

推导式_字典_enumerate

在 Python 中实现类似列表的索引访问