2

现在我想建立一个包含100*50二维点的列表。我尝试了以下方法:

[(x+0.5, y+0.5) for x, y in zip(range(100), range(50))]

这只能给我 50*50 分。我在这个答案中找到了解释这一点的原因,指出

对于 zip,新列表的长度与最短列表的长度相同。

正确获得我想要的分数的最 Pythonic方式是什么?100*50

4

5 回答 5

10

好吧,我想你想要itertools.product而不是zip.

itertools.product计算两个列表的笛卡尔积,总分为 100*50。

你这样做的方式是

import itertools
[(x+0.5,y+0.5) for x,y in itertools.product(range(100),range(50))]

你也可以这样做,嵌套 for 循环,但总的来说,我会说 itertools.product 更具可扩展性和更 Pythonic(平面比嵌套更好)

于 2013-10-16T05:21:56.080 回答
3

这是一种添加较少的方法(仅 150 与 5000 相比)

>>> from itertools import product
>>> list(product(map(.5.__add__, range(100)), map(.5.__add__, range(50))))
[(0.5, 0.5), (0.5, 1.5), (0.5, 2.5), (0.5, 3.5), (0.5, 4.5), (0.5, 5.5), (0.5, 6.5), (0.5, 7.5), (0.5, 8.5), (0.5, 9.5),...
于 2013-10-16T05:33:26.770 回答
2

您需要一个循环 forx和一个 for y

>>> points = [(x+0.5, y+0.5) for x in xrange(100) for y in xrange(50)]
>>> len(points)
5000
>>> 100 * 50
5000
于 2013-10-16T05:22:19.627 回答
2

两个循环。

[(x+0.5, y+0.5) for x in range(100) for y in range(50))]
于 2013-10-16T05:22:20.660 回答
0

您还可以使用 numpy.meshgrid:

import numpy as np
x, y = np.meshgrid(np.arange(0,100,1),np.arange(0,50,1))
于 2017-05-31T16:54:35.950 回答