2017-04-10 131 views
1

考虑两个numpy的阵列选择元素

array1 = np.arange(0,6) 
array2 = np.arange(0,12) 

我想一个运行回路(优选列表中理解),其中希望输出为单轮是

print(array1[0]) 
print(array2[0],array2[1]) or 

print(array1[1]) 
print(array2[2], array2[3]) 

即循环运行六次,但对于array1中的每一轮,它都会从array2中选择两个连续的元素。

我已经试过类似

for i in xrange(array1): 
    for v in xrange(array2): 

但这显然运行的第一个内第二圈,我怎么能同时运行它们,但在一个回合每个阵列选择不同数量的元素?

我也试图使回路长度相等如

array1 = np.repeat(np.arange(0,6),2).ravel() 
array1 = [0,0,1,1,2,2.....5,5] 

然而,这将使两个数组的长度相等,但我仍然不能得到所需的输出

(在实际情况下,阵列的元素是熊猫系列对象)

+2

重塑第二阵列:'array2.reshape(-1,2)',然后使用相同的迭代索引来索引到'array1'和重构'array2'? – Divakar

+0

这与熊猫无关。已移除标记。 –

+0

@Divakar。感谢提醒我'-1'形状。我会将其纳入我的答案。 –

回答

0
for i in xrange(array1): 
    print(array1[i]) 
    print(array2[2*i],array2[2*i+1]) 
2

有很多不同的方式去做这件事。你可以做的一件事是使用索引:

for ind, item in array1: 
    print(item, array2[2*ind:2*ind+2]) 

但是,这并不使用numpy的全部力量。我能想到的最简单的事情是将数组连接成一个包含所需序列的单个数组。你可以把它变成一个二维数组,便于重复,其中每列或行会是你想要三个元素的顺序:

array1 = np.arange(6) 
array2 = np.arange(12) 
combo = np.concatenate((array1.reshape(-1, 1), array2.reshape(-1, 2)), axis=1) 
for row in combo: 
    print(row) 

结果

[0 0 1] 
[1 2 3] 
[2 4 5] 
[3 6 7] 
[4 8 9] 
[ 5 10 11] 

在这种情况下,明确的重塑的array1是必要的,因为array1.T将导致1D数组。

您可以使用这两种方法的混合,如@Divakar建议,在那里你重塑a2,而是使用索引迭代:

array3 = array2.reshape(-1, 2) 
for ind, item in array1: 
    print(item, array3[ind]) 
+0

而且''reshape''没有额外的内存需求。 – Divakar

+0

@Divakar是否因为如果可能的话它返回'数组视图'? – kmario23

+1

@ kmario23没错!做:'array2.reshape(-1,2)[2] = 99',你会改变'array2'本身。 – Divakar

2

是的,作为@MadPhysicist提到的,有很多的方式来为此....但最简单的是

>>> for x,y,z in zip(array1,array2[:-1:2],array2[1::2]): 
... print x,y,z 
... 
0 0 1 
1 2 3 
2 4 5 
3 6 7 
4 8 9 
5 10 11 
+0

你也可以做'zip(array1,* array2.reshape(-1,2).T)'。无论哪种方式,使用zip的+1。 –

+0

谢谢@MadPhysicist,我相信我的版本(也许更少Pythonical),但更具可读性。 – rth

+1

我留下的评论更多的是对未来的读者的一个侧面说明,而不是对你的真实评论。我同意你写的方式是最好的。只有在列数大于2的情况下,我的工作才会更好。 –