我有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')
但这只是给了一个列表,我怀疑是数组中的第一个列表。
答案 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]]]
现在我们需要处理数组aL
和bL
。这些数组是平的,所以我们必须先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)
听起来你需要x
和y
的嵌套循环:
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])