从两个不等长的numpy数组中选择元素

时间:2017-04-10 19:16:13

标签: python list numpy

考虑两个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]

然而,这将使两个数组的长度相等,但我仍然无法获得所需的输出

(在实际情况中,数组的元素是pandas Series对象)

3 个答案:

答案 0 :(得分:2)

有很多不同的方法可以解决这个问题。你可以做的一件事是使用指数:

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

然而,这并没有使用numpy的全部功能。我能想到的最简单的事情是将数组连接成一个包含所需序列的数组。您可以将其转换为2D数组以便于迭代,其中每列或每行将是您想要的三个元素的序列:

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将导致一维数组。

你可以使用两种方法的混合,正如@Divakar建议的那样,你重塑a2但是使用索引进行迭代:

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

答案 1 :(得分: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

答案 2 :(得分:0)

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