我有一些1维或2维的数据。我想遍历数据集中的每个模式并对其执行foo()。如果数据是1D,则将该值添加到列表中,如果它是2D,则取内部列表的平均值并附加该值。 我看到了this question,并决定实施它来检查列表的实例。我不能在这个应用程序中使用numpy。
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创建一个单独的类,但这将为我的代码添加许多类。数据集可能会变得非常大,因此最好采用快速解决方案。
答案 0 :(得分:2)
您的代码已经几乎尽可能快速和快速。唯一的小改进是将[foo(window) for window in row]
替换为map(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
但是,如果你算得很简洁,你也可以简化你的代码(将map
替换后)改为:
mean = lambda x: sum(x)/float(len(x)) #or `from statistics import mean` in python3.4
output = [foo(r) if isinstance(r, int) else mean(map(foo, r)) for r in data]