现在我想建立一个包含100*50
二维点的列表。我尝试了以下方法:
[(x+0.5, y+0.5) for x, y in zip(range(100), range(50))]
这只能给我 50*50 分。我在这个答案中找到了解释这一点的原因,指出
对于 zip,新列表的长度与最短列表的长度相同。
正确获得我想要的分数的最 Pythonic方式是什么?100*50
好吧,我想你想要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(平面比嵌套更好)
这是一种添加较少的方法(仅 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),...
您需要一个循环 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
两个循环。
[(x+0.5, y+0.5) for x in range(100) for y in range(50))]
您还可以使用 numpy.meshgrid:
import numpy as np
x, y = np.meshgrid(np.arange(0,100,1),np.arange(0,50,1))