检查Python中的多维列表
我有一些1维或2维的数据。我希望遍历数据集中的每个模式,并对其执行foo()。如果数据是1D,则将该值添加到列表中,如果是2D,则取内部列表的平均值并附加该值。 我看到了,并决定实现它,例如检查列表。我无法将numpy用于此应用程序检查Python中的多维列表,python,list,multidimensional-array,Python,List,Multidimensional Array,我有一些1维或2维的数据。我希望遍历数据集中的每个模式,并对其执行foo()。如果数据是1D,则将该值添加到列表中,如果是2D,则取内部列表的平均值并附加该值。 我看到了,并决定实现它,例如检查列表。我无法将numpy用于此应用程序 outputs = [] for row in data: if isinstance(row, list): vals = [foo(window) for window in row]
outputs = []
for row in data:
if isinstance(row, list):
vals = [foo(window) for window in row]
outputs.append(sum(vals)/float(len(vals)))
else:
outputs.append(foo(row))
有没有更整洁的方法?在每次运行中,每个模式都具有相同的维度,因此我可以为1D/2D创建一个单独的类,但这将为我的代码添加很多类。数据集可能会变得相当大,因此最好采用快速解决方案。您的代码已经尽可能地整洁和快速了。唯一的轻微改进是将
[foo(窗口)替换为行中窗口]
替换为映射(foo,row)
,这可以通过基准测试看到:
> python -m timeit "foo = lambda x: x+1; list(map(foo, range(1000)))"
10000 loops, best of 3: 132 usec per loop
> python -m timeit "foo = lambda x: x+1; [foo(a) for a in range(1000)]"
10000 loops, best of 3: 140 usec per loop
isinstance()
似乎已经比其对应的hasattr()
和type()==
更快了:
> python -m timeit "[isinstance(i, int) for i in range(1000)]"
10000 loops, best of 3: 117 usec per loop
> python -m timeit "[hasattr(i, '__iter__') for i in range(1000)]"
1000 loops, best of 3: 470 usec per loop
> python -m timeit "[type(i) == int for i in range(1000)]"
10000 loops, best of 3: 130 usec per loop
但是,如果您认为简短整洁,也可以简化代码(替换
映射后)到:
mean=lambda x:sum(x)/float(len(x))#或python3.4中的“从统计数据导入平均值”
输出=[foo(r)if isinstance(r,int)else mean(map(foo,r))表示数据中的r]
我会检查hasattr(第[0]行,“'u iter_uuu')而不是isinstance(),但我认为没有更快或更优雅的方法。对meSee来说也很整洁。Python3.4(如果您有幸使用它)引入了@knitti集合。应该改用Iterable
,而\uu iter_uuu
对字符串无效。