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

2024-04-20 10:06:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: or方法innumpy元素列表for数量
3条回答

是的,正如@madpysicalist提到的,有很多方法可以做到这一点。。。。但最简单的是

>>> 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

有很多不同的方法。您可以使用索引:

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

您可以使用这两种方法的混合,正如@Divakar所建议的,在这里您可以重塑a2,但使用索引进行迭代:

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

相关问题 更多 >