列表推导式可以实现索引吗?这是否可行?

3

我现在使用的方法看起来非常笨拙。有没有更好的方法来索引这个数组?

以下是可行的代码:

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)

第一行创建了一个空的三维数组。最终,我想在一个三维数组中加载和存储一系列时间序列数据,以便您可以使用DEM[t, i, j]来索引它。

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


DEM_filename_list 的类型是什么? - Mazdak
不相关,但是DEM_filename_list[:number_of_DEM_files]会和你的列表推导式达到相同的效果。 - Padraic Cunningham
你是不是在 number_of_DEM Files 中漏了一个下划线? - stellasia
我觉得用一个简单的for循环来做这个并不笨拙,尽管我不明白第一行代码的作用是什么。 - lucasnadalutti
DEM = [np.load(f) for f in DEM_filename_list]是什么意思?您想从不同的文件中构建一个具有行值的矩阵吗? - wenzul
根本问题在于 np.load 不接受文件名列表,只能接受一个文件名。但是你可以将加载的结果收集到一个列表或数组中。 - hpaulj
3个回答

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

Output:

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

或者呈现您的注释:

(原文中含有HTML代码,已保留)
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] - Dunes
真的,我已经更新了,谢谢。请注意,正如我在更新中写的那样,在赋值之前不需要任何操作。 - Geeocode

1
我不确定 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]

-1

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

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


不要在numpy中这样做。这会导致你失去向量化带来的所有性能优势。 - Slater Victoroff
你可以从range和enumerate中获得类似的性能表现:https://dev59.com/GWct5IYBdhLWcg3wkuTE - Ramón J Romero y Vigil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接