【问题标题】:select elements from two unequal length numpy arrays从两个不等长的numpy数组中选择元素
【发布时间】:2017-04-10 19:16:12
【问题描述】:

考虑两个 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系列对象)

【问题讨论】:

  • 重塑第二个数组:array2.reshape(-1,2),然后使用相同的迭代索引索引到array1,并重塑array2
  • 这与pandas无关。删除标签。
  • @Divakar。感谢您提醒我-1 形状。我会将其纳入我的答案中。

标签: python list numpy


【解决方案1】:

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

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

【讨论】:

  • 还有一个额外的好处,那就是reshape 不需要额外的内存。
  • @Divakar 是不是因为如果可能的话,它会返回一个“数组视图”?
  • @kmario23 没错!做:array2.reshape(-1,2)[2] = 99 你会改变array2 本身。
【解决方案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

【讨论】:

  • 你也可以zip(array1, *array2.reshape(-1, 2).T)。无论哪种方式,使用 zip 时 +1。
  • 感谢@MadPhysicist,我相信我的版本(可能不那么 Pythonical)但更具可读性。
  • 我留下的评论更像是给未来读者的旁注,而不是真正给你的说明。我同意你写它的方式是最好的。只有当你的列数比 2 多得多时,我的才会更好。
【解决方案3】:
for i in xrange(array1):
   print(array1[i])
   print(array2[2*i],array2[2*i+1])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2012-05-21
    • 2014-05-15
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多