亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對 numpy 數組中的非零元素求和

對 numpy 數組中的非零元素求和

守著一只汪 2023-09-19 17:04:24
我想對數組(1-d)的非零元素求和,但對正整數和負整數分別進行求和(它們只能是一和二),并在它們所在的位置顯示零。數組的示例:array = np.array([0, 0, 0, -1, -1, 0, 1, 2, 1, 1, 0, -1, 0, 1, 1, -1, -2])輸出:array([0, 0, 0, -2, 0, 5, 0, -1, 0, 2, -3])我認為我的問題是我不知道如何分離數組中正值和負值的序列。
查看完整描述

2 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

這是一種方法 -


def sum_by_signs(a):

    m1 = a<0

    m2 = a>0

    m0 = a==0 # or ~m1 & ~m2

    p = np.flatnonzero(m0[:-1] | np.diff(m1) | np.diff(m2))+1

    return np.add.reduceat(a, np.r_[0,p])

或者將該np.r_[0部分帶入布爾構造部分 -


def sum_by_signs_v2(a):

    m1 = a<0

    m2 = a>0

    m0 = a==0 # or ~m1 & ~m2

    p = np.flatnonzero(np.r_[True, m0[:-1] | np.diff(m1) | np.diff(m2)])

    return np.add.reduceat(a, p)

解釋


我們的想法是根據符號變化或當我們遇到一系列 0 時將數組拆分為“島”,在這種情況下,我們希望將每個元素拆分為單獨的元素。通過拆分,可以將其視為列表的列表,如果這樣更容易理解的話。現在,游戲是我們如何獲得這些分裂。我們需要表示這些島嶼的開始、停止索引的索引。如前所述,存在三種情況,符號從 變為+或-相反,或者 0 序列。


因此,布爾掩碼的結構用于為這些索引提供一次性切片,以檢測從+到 的符號變化-,反之亦然np.diff(m1) | np.diff(m2)。最后一個m0[:-1]是針對 的序列0s。然后將這些指數輸入np.add.reduceat以獲得間隔求和。


樣本運行 -


In [208]: a

Out[208]: array([ 0,  0,  0, -1, -1,  0,  1,  2,  1,  1,  0, -1,  0,  1,  1, -1, -2])


In [209]: sum_by_signs(a)

Out[209]: array([ 0,  0,  0, -2,  0,  5,  0, -1,  0,  2, -3])


In [211]: a

Out[211]: array([ 1,  2,  0, -1, -1,  0,  1,  2,  1,  1,  0, -1,  0,  1,  1, -1, -2])


In [212]: sum_by_signs(a)

Out[212]: array([ 3,  0, -2,  0,  5,  0, -1,  0,  2, -3])


In [214]: a

Out[214]: 

array([ 1,  2,  0, -1, -1,  0,  1,  2,  1,  1,  0, -1,  0,  1,  1, -1, -2,

        0])


In [215]: sum_by_signs(a)

Out[215]: array([ 3,  0, -2,  0,  5,  0, -1,  0,  2, -3,  0])


查看完整回答
反對 回復 2023-09-19
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

這解決了問題,但肯定有更聰明的方法來做到這一點


array = [0, 0, 0, -1, -1, 0, 1, 2, 1, 1, 0, -1, 0, 1, 1, -1, -2]


switch = 0

while switch == 0:

    for i in range(len(array)):

        try:

            array[i+1]

            if array[i] > 0 and array[i+1] > 0: 

                array[i] += array[i + 1]

                array.pop(i + 1)

                break

            elif array[i] < 0 and array[i+1] < 0:   

                array[i] += array[i + 1]

                array.pop(i + 1)

                break

        except:

            switch = 1

            break

最后,數組的值為 [0, 0, 0, -2, 0, 5, 0, -1, 0, 2, -3]


查看完整回答
反對 回復 2023-09-19
  • 2 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號