用列表推导索引?可能吗?
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/…以上是关于用列表推导索引?可能吗?的主要内容,如果未能解决你的问题,请参考以下文章
用 Jquery 中另一个 html 列表的索引填充一个 html 列表