gpt4 book ai didi

python - 倒序顺序数字

转载 作者:太空狗 更新时间:2023-10-30 00:58:20 25 4
gpt4 key购买 nike

我有一个很长的数组,我正在尝试以尽可能高效的方式执行以下操作:

对于列表中每个连续递增的 block ,我必须颠倒它的顺序。

所以,对于下面的数组:

a = np.array([1,5,7,3,2,5,4,45,1,5,10,12])

我想获得:

array([7,5,1,3,5,2,45,4,12,10,5,1])

我想知道是否可以使用 numpy 将其矢量化?

我在this中已经有了一些答案previous question,但是结果,虽然是很大的改进,但是还是有点慢。

最佳答案

没有依赖的其他选项:

array = [1,5,7,3,2,5,4,45,1,5,10,12]

res, memo = [], []
for e in array:
if len(memo) == 0 or e > memo[-1]: memo.append(e)
else:
res.extend(reversed(memo))
memo = [e]
res.extend(reversed(memo))

res # => [7, 5, 1, 3, 5, 2, 45, 4, 12, 10, 5, 1]


更快一点的修改版本:

def reverse_if_chunck_increases(array):
res, memo, last_memo = [], [], None
for e in array:
if not last_memo or e > last_memo:
last_memo = e
memo.append(e)
else:
res.extend(memo[::-1])
last_memo, memo = e, [e]
res.extend(memo[::-1])
return res

print(reverse_if_chunck_increases(array) == [7, 5, 1, 3, 5, 2, 45, 4, 12, 10, 5, 1])
#=> True


接受答案后进行编辑(也许有用。)

我能够如此轻松地获得结果,并且显然在 Ruby 中编码速度更快:

array.chunk_while { |x, y| x < y }.flat_map{ |chunk| chunk.reverse }

所以,我想知道为什么没有像chunk_while 这样的itertool。然后我尝试使用 yield 编写一个类似的代码:

def reverse_if_chunk_increases(array):
i, x, size, res = 0, 0, len(array), []
while i < size-1:
if array[i] > array[i+1]:
yield array[x:i+1][::-1]
x = i +1
i += 1
yield array[x:size][::-1]

执行速度超快,但它返回一个生成器来迭代而不是列表:

chunks = reverse_if_chunk_increases(array)
for chunk in chunks:
print(chunk)
# [7, 5, 1]
# [3]
# [5, 2]
# [45, 4]
# [12, 10, 5, 1]

可以转换成列表,这是最慢的过程。请注意,生成器可以被调用一次。删除 [::-1] 您会得到类似于 Ruby 枚举器/生成器 chunk_while 的结果。

关于python - 倒序顺序数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54013340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com