我有一個只有 -1、1 和 0 的 numpy 陣列,如下所示:
np.array([1,1,-1,-1,0,-1,1])
我想要一個計算遇到的 -1 的新陣列。計數器必須在出現 0 時重置,并在出現 1 時保持不變:
期望的輸出:
np.array([0,0,1,2,0,1,1])
當與更大的陣列(最多 100 000)一起使用時,該解決方案必須非常耗時
編輯:感謝您的貢獻,我現在有一個可行的解決方案。
我仍在尋找一種非迭代的方法來解決它(無for回圈)。也許用熊貓系列和cumsum()方法?
uj5u.com熱心網友回復:
也許用熊貓系列和
cumsum()方法?
是的,使用Series.cumsum和Series.groupby:
s = pd.Series([1, 1, -1, -1, 0, -1, 1])
s.eq(-1).groupby(s.eq(0).cumsum()).cumsum().to_numpy()
# array([0, 0, 1, 2, 0, 1, 1])
一步步
創建在等于 0 時重置的偽組:
groups = s.eq(0).cumsum() # array([0, 0, 0, 0, 1, 1, 1])那么
groupby這些偽組cumsum當等于 -1 時:s.eq(-1).groupby(groups).cumsum().to_numpy() # array([0, 0, 1, 2, 0, 1, 1])
時間安排
與更大的陣列(最多 100,000)一起使用時不耗時
groupby cumsum比回圈快 8 倍,給定np.random.choice([-1, 0, 1], size=100_000):
%timeit series_cumsum(a)
# 3.29 ms ± 721 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit miki_loop(a)
# 26.5 ms ± 925 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit skyrider_loop(a)
# 26.8 ms ± 1.36 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
uj5u.com熱心網友回復:
使用for回圈。設定一個從 開始的變數,1并在每次遇到不同的數字時重置它。例如:
counter = 1;
outputArray = [];
for number in npArray:
if number == -1:
outputArray.append(counter)
counter = 1
elif number == 1:
outputArray.append(0)
else:
outputArray.append(0)
counter = 1
print(outputArray)
uj5u.com熱心網友回復:
這是@skyrider 代碼的修復程式
npArray = [1,1,-1,-1,0,-1,1]
counter = 0
outputArray = []
for number in npArray:
if number == -1:
counter = 1
outputArray.append(counter)
elif number == 0:
outputArray.append(0)
counter = 0
else:
outputArray.append(counter)
print(outputArray)
uj5u.com熱心網友回復:
a = np.array([1,1,-1,-1,0,-1,1])
l = []
count = 0
for i in a:
if i == -1:
count =1
elif i==0:
count = 0
l.append(count)
out = np.array(l)
out
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377540.html
上一篇:python圖形的for回圈
