我需要生成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]
这意味着从原始数组中选择数组,然后将其反转。
a[6:0:-1]
时会得到[13, 8, 5, 3, 2]
,但是一旦尝试a[6:-1:-1]
时就会得到一个空数组[]
?我希望当您尝试a[::-1]
时,整个阵列都颠倒过来。帖子Understanding slice notation回答了我的第一个问题,但没有回答第二个问题。
答案 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])