从两个坐标数组创建所有x,y对

时间:2017-02-24 12:13:26

标签: python list loops for-loop

我有4个需要迭代的列表,以便我得到以下内容:

x     y     a     b

列表a和b长度相等,我使用zip函数迭代两者,代码:

for a,b in zip(aL,bL):
    print(a,"\t",b)

列表x包含1000个项目,列表b包含750个项目,循环结束后我应该有750.000行。

想要实现的目标如下:

1   1   a   b
1   2   a   b
1   3   a   b
1   4   a   b
.....
1000   745   a   b
1000   746   a   b
1000   747   a   b
1000   748   a   b
1000   749   a   b
1000   750   a   b

我怎样才能做到这一点?我尝试过枚举和izip,但结果都不是我想要的。

感谢。

编辑:

我已经按照您的代码使用,因为它更快。我的输出现在看起来像这样:

[[[  0.00000000e+00   0.00000000e+00   4.00000000e+01   2.30000000e+01]
  [  1.00000000e+00   0.00000000e+00   8.50000000e+01   1.40000000e+01]
  [  2.00000000e+00   0.00000000e+00   7.20000000e+01   2.00000000e+00]
  ..., 
  [  1.44600000e+03   0.00000000e+00   9.20000000e+01   4.60000000e+01]
  [  1.44700000e+03   0.00000000e+00   5.00000000e+01   6.10000000e+01]
  [  1.44800000e+03   0.00000000e+00   8.40000000e+01   9.40000000e+01]]]

我现在有750个列表,每个列表都有1000个。我试图压扁它们以获得每行4个值(x,y,a,b)。这需要永远。还有另一种方法来压扁这些吗?

EDIT2

我试过了

np.fromiter(itertools.chain.from_iterable(arr), dtype='int')

但它给出了错误:设置一个带序列的数组元素,所以我试过

np.fromiter(itertools.chain.from_iterable(arr[0]), dtype='int') 

但这只是给了一个列表,我怀疑是数组中的第一个列表。

3 个答案:

答案 0 :(得分:1)

编辑v2

现在使用np.stack代替np.dstack,并处理文件输出。

这比下面提出的解决方案简单得多。

import numpy as np
import numpy.random as nprnd

aL = nprnd.randint(0,100,size=10) # 10 random ints
bL = nprnd.randint(0,100,size=10) # 10 random ints

xL = np.linspace(0,100,num=5) # 5 evenly spaced ints
yL = np.linspace(0,100,num=2) # 2 evenly spaced ints

xv,yv = np.meshgrid(xL,yL)

arr = np.stack((np.ravel(xv), np.ravel(yv), aL, bL), axis=-1)

np.savetxt('out.out', arr, delimiter=' ')

使用np.meshgrid为我们提供了以下两个数组:

xv = [[   0.   25.   50.   75.  100.]
     [   0.   25.   50.   75.  100.]]
yv = [[   0.    0.    0.    0.    0.]
     [ 100.  100.  100.  100.  100.]]

当我们狂欢时,成为:

np.ravel(xv) = [   0.   25.   50.   75.  100.    0.   25.   50.   75.  100.]
np.ravel(yv) = [   0.    0.    0.    0.    0.  100.  100.  100.  100.  100.]

这些数组的形状与aL和bL相同,

aL = [74 79 92 63 47 49 18 81 74 32]
bL = [15  9 81 44 90 93 24 90 51 68]

所以剩下的就是stack所有四个数组axis=-1

arr = np.stack((np.ravel(xv), np.ravel(yv), aL, bL), axis=-1)
arr = [[   0.    0.   62.   41.]
       [  25.    0.    4.   42.]
       [  50.    0.   94.   71.]
       [  75.    0.   24.   91.]
       [ 100.    0.   10.   55.]
       [   0.  100.   41.   81.]
       [  25.  100.   67.   11.]
       [  50.  100.   21.   80.]
       [  75.  100.   63.   37.]
       [ 100.  100.   27.    2.]]

从这里开始,拯救是微不足道的:

np.savetxt('out.out', arr, delimiter=' ')

原始回答

idx = 0
out = []
for x in xL:
    for y in yL:
        v1 = aL[idx]
        v2 = bL[idx]
        out.append((x, y, v1, v2))
        # print(x,y, v1, v2)
        idx += 1

但是,它很慢,只有坐标越来越慢。我考虑使用numpy包。这是一个2 x 5数据集的示例。

aL = nprnd.randint(0,100,size=10) # 10 random ints
bL = nprnd.randint(0,100,size=10) # 10 random ints

xL = np.linspace(0,100,num=5) # 5 evenly spaced ints
yL = np.linspace(0,100,num=2) # 2 evenly spaced ints


lenx = len(xL) # 5
leny = len(yL) # 2

arr = np.ndarray(shape=(leny,lenx,4)) # create a 3-d array

这创建了具有2行×5列形状的3维阵列。在第三个轴(长度为4)上,我们使用您想要的数据填充数组。

for x in range(leny):
    arr[x,:,0] = xL

这种语法起初有点令人困惑。您可以了解有关它的更多信息here。简而言之,它迭代行数并将数组的特定切片设置为xL。在这种情况下,我们选择的切片是第x行的所有列中的第0个索引。 (:表示,"选择此轴上的所有索引")。对于我们的小例子,这将产生:

[[[  0   0   0   0]
  [ 25   0   0   0]
  [ 50   0   0   0]
  [ 75   0   0   0]
  [100   0   0   0]]

 [[  0   0   0   0]
  [ 25   0   0   0]
  [ 50   0   0   0]
  [ 75   0   0   0]
  [100   0   0   0]]]

现在我们对每一栏都做同样的事情:

for y in range(lenx):
    arr[:,y,1] = yL

-----

[[[  0   0   0   0]
  [ 25   0   0   0]
  [ 50   0   0   0]
  [ 75   0   0   0]
  [100   0   0   0]]

 [[  0 100   0   0]
  [ 25 100   0   0]
  [ 50 100   0   0]
  [ 75 100   0   0]
  [100 100   0   0]]]

现在我们需要处理数组aLbL。这些数组是平的,所以我们必须先reshape它们符合arr的形状。在我们的简单示例中,这将采用长度为10的数组并将其重新整形为2 x 5的二维数组。

a_reshaped = aL.reshape(leny,lenx)
b_reshaped = bL.reshape(leny,lenx)

将重新整形的数组插入我们的arr,我们为所有行和所有列选择第2和第3个索引(这次请注意两个:

arr[:,:,2] = a_reshaped
arr[:,:,3] = b_reshaped

----

[[[  0   0   3  38]
  [ 25   0  63  89]
  [ 50   0   4  25]
  [ 75   0  72   1]
  [100   0  24  83]]

 [[  0 100  55  85]
  [ 25 100  39   9]
  [ 50 100  43  85]
  [ 75 100  63  57]
  [100 100   6  63]]]

这比嵌套循环解决方案运行得快得多。希望它有所帮助!

答案 1 :(得分:0)

听起来你需要xy的嵌套循环:

for x in yL:
    for y in yL:
        for a, b in zip(aL, bL):
            print "%d\t%d\t%s\t%s" % (x, y, a, b)

答案 2 :(得分:0)

试试这个,

for i,j in zip(zip(a,b),zip(c,d)):
     print "%d\t%d\t%s\t%s" % (i[0], i[1], j[0], j[1])