如何避免迭代构建numpy数组

huwehgph  于 2023-04-06  发布在  其他
关注(0)|答案(3)|浏览(100)

我知道迭代numpy数组比使用numpy函数更昂贵。这对我来说很重要,因为我的数组非常大。
请使用提供的代码作为解释我想实现什么

start_value = 12
start_arr = np.array([-2, -4, -60, -0.5, 2, 2, 1, 70, -2, -5, 2])

out_arr = []
ans = start_value
for i in start_arr:
    if i > 0:
        out_arr.append(i)
        ans = i
    else:
        out_arr.append(ans)

out_arr = np.array(out_arr)
# [12, 12, 12, 12, 2, 2, 1, 70, 70, 70, 2]

我不知道如何告诉numpy在case i <= 0中使用“以前”分配的值。而且我无法向浏览器的搜索引擎解释这个问题,因为它会输出一些有用的东西。

unguejic

unguejic1#

使用pandas

import pandas as pd

out_arr = (pd.Series(start_arr).where(start_arr>0)
           .ffill().fillna(start_value, downcast='infer').to_numpy()
           )

输出:

array([12, 12, 12, 12,  2,  2,  1, 70, 70, 70,  2])

一个numpy方法(灵感来自this answer):

a = np.r_[start_value, start_arr]
# array([ 12. ,  -2. ,  -4. , -60. ,  -0.5,   2. ,   2. ,   1. ,  70. ,
#         -2. ,  -5. ,   2. ])

idx = np.maximum.accumulate(np.where(a>0, np.arange(a.shape[0]), 0))
# array([ 0,  0,  0,  0,  0,  5,  6,  7,  8,  8,  8, 11])

out_arr = a[idx][1:]
# array([12., 12., 12., 12.,  2.,  2.,  1., 70., 70., 70.,  2.])
jm2pwxwz

jm2pwxwz2#

您可以为输出数组中的每个值构建一个源索引数组。源索引是前一个正值的索引。您可以在将负位置的索引归零后使用numpy.maximum.accumulate函数计算这些索引。
在此之后,可以单独处理前导负项。

import numpy as np

start_value = 12
start_arr = np.array([-2, -4, -60, -0.5, 2, 2, 1, 70, -2, -5, 2])

source     = np.arange(start_arr.size)                 # all indices
source[start_arr <= 0] = 0                             # zero out negatives
out_arr    = start_arr[np.maximum.accumulate(source)]  # assign from source
out_arr[out_arr<=0] = start_value                      # leading negatives 

print(out_arr)

# [12. 12. 12. 12.  2.  2.  1. 70. 70. 70.  2.]
u7up0aaq

u7up0aaq3#

以下是我的解决方案,只使用Numpy(用任何你想要的东西改变12):
'''
import numpy as np
array = np.array([-2,-4,-60,-0.5,2,2,1,70,-2,-5,2])
替换= 12
为真时:

Ind = np.argmax(array<= 0)

if Ind>0 or replacement == 12:

    if replacement == 12:

        array[Ind]  = replacement

        replacement = None

    else:

        array[Ind]  = array[Ind-1]

else:

    break

'''

相关问题