以相反的顺序从numpy数组中获取一些元素

时间:2019-06-18 12:58:58

标签: python arrays numpy reverse

我需要生成numpy数组,以相反的顺序从另一个数组中获取元素。

玩具示例代码

假设我使用以下玩具示例代码:

import numpy as np
a = np.array([1,2,3,5,8,13])
n = len(a)

for i in range(n):
    print a[n:n-i-2:-1]

我希望最后打印的是[13 8 5 3 2 1],但是我得到一个空数组[],如下所示:

>>> 
[13]
[13  8]
[13  8  5]
[13  8  5  3]
[13  8  5  3  2]
[]

修复

因此,我必须在for循环中为我的代码创建以下修补程序,才能获得期望的结果。

for i in range(n):
    print a[n-i-1:n+1][::-1]

这意味着从原始数组中选择数组,然后将其反转。

问题

  1. 为什么当我尝试a[6:0:-1]时会得到[13, 8, 5, 3, 2],但是一旦尝试a[6:-1:-1]时就会得到一个空数组[]?我希望当您尝试a[::-1]时,整个阵列都颠倒过来。
  2. 是我实施的解决方案,还是这里缺少一些东西?

编辑

帖子Understanding slice notation回答了我的第一个问题,但没有回答第二个问题。

3 个答案:

答案 0 :(得分:2)

这是一个稍微更优雅的修补程序。

for i in range(n):
    print a[n:-i-2:-1]

或更优雅

for i in range(n):
    print a[:-i-2:-1]

同时打印

[13]
[13  8]
[13  8  5]
[13  8  5  3]
[13  8  5  3  2]
[13  8  5  3  2  1]

它还演示了负索引从顶部开始计数的规则,这就是为什么当停止索引达到-1时原始循环会切换行为的原因。

答案 1 :(得分:1)

另一种选择是使用以下代码:

import numpy as np
a = np.array([1,2,3,5,8,13])
n = len(a)

l = range(n)
l[n-1] = None

for i in range(n):
    print a[n:l[n-i-2]:-1]

执行a[n:None:-1]a[::-1]一样

答案 2 :(得分:1)

使用列表理解并将结果汇​​总到一行:

import numpy as np

a = np.array([1,2,3,5,8,13])
n = len(a)

# use list comprehension here
[list(a[n:-i-2:-1]) for i in range(n)]
# [[13],
#  [13, 8],
#  [13, 8, 5],
#  [13, 8, 5, 3],
#  [13, 8, 5, 3, 2],
#  [13, 8, 5, 3, 2, 1]]

如果您确实需要循环显式,请使用以下命令:

for i in range(n):
    print(a[n:-i-2:-1])