簡體   English   中英

如何遍歷 NumPy 數組,同時按索引過濾單元格值並對其執行數學運算

[英]How to iterate through a NumPy array while filtering cells values by index and performing math on it

我試圖在同一次迭代中過濾/循環並執行數學運算,但似乎找不到正確的答案。 我有一個 numpy 數組,大小為 6、2,由兩個我想減去的值組成,但是我希望在減去過程開始之前過濾這些值。

因此,如果該值大於另一列中的值,則應從高值中減去最低值,反之亦然 這也需要在一個循環中發生,該循環在執行過濾和數學運算時遍歷數組。

這是我的代碼示例:

#minus price
print('minus price trying appending')
minus_p_orgp1 = np.append(dif_p_times1, fp, axis=0)
print(minus_p_orgp1)

for ii, vv in enumerate(minus_p_orgp1):
    print('greater')
    greater_1 = np.all(ii > 0, axis=0)
    greater_0 = np.all(ii <= 0, axis=0)
    if greater_1 < greater_0:
        iit = greater_0 - greater_1
    if greater_1 > greater_0:
        iit = greater_1 - greater_0
        print(iit, ii, vv)

ssss = np.zeros(minus_p_orgp1.size - 1)
for i in range(len(minus_p_orgp1) - 1):
    if minus_p_orgp1[i] < minus_p_orgp1[i]:
        ssss[i] = minus_p_orgp1[i + 1] - minus_p_orgp1[i]
    elif minus_p_orgp1[i + 1] > minus_p_orgp1[i]:
        ssss[i] = minus_p_orgp1[i] - minus_p_orgp1[i + 1]
print(ssss)

這是數組的打印,其中上向量是 def_p_time1,下向量是 fp:

  minus price trying appending
[[79340.33057205 78379.24102508 72188.80527274 76557.26239563
  72857.90423589 71137.7943199 ]
 [43528.22       43705.         43931.07       44571.24
  44330.43       44465.64      ]]

我可以做些什么來實現我的目標?

我也嘗試過將數組作為兩個大小為 6、1 的獨立向量來完成這個過程。但這似乎也很困難,讓我知道你的想法。

我也剛試過這個; 但是它在運行代碼時只會打印出零:

trii = np.array([[0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1]])
print(trii)
print(minus_p_orgp1[~(trii >= 1)])
print('it works')
itt = minus_p_orgp1[~(trii >= 1)]
itt1 = minus_p_orgp1[~(trii >= 0)]
sssss = np.zeros(dif_p_times1.size - 1)
ssss = np.zeros(minus_p_orgp1.size - 1)
for i in range(len(dif_p_times1) - 1):
    for ii in range(len(fp) - 1):
        if itt < itt1:
            sssss[i] = itt[i] + itt1[i + 1]
            ssss[i, ii] = fp[ii + 1] - dif_p_times1[i]

        elif itt > itt1:
            sssss[i] = itt[i + 1] + itt1[i]
            ssss[i, ii] = dif_p_times1[i] - fp[ii + 1]
print(sssss)

[[0 0 0 0 0 0]
 [1 1 1 1 1 1]]
[63455.70703442 68744.47486851 77804.44752373 79686.34612013
 69322.78250338 83255.08459329]
it does something
[0. 0. 0. 0. 0.]

這是一個新的嘗試,但它仍然不起作用:

ssss = np.zeros(minus_p_orgp1.size - 1)
x = minus_p_orgp1[::2]
y = minus_p_orgp1[::-2]
z = ssss[::2]

for z, x, y in range(len(minus_p_orgp1) - 1):
    
    if x[i + 1] < y[i]:
        z[i] = y[i + 1] - x[i]
    elif x[i + 1] > y[i]:
        z[i] = x[i + 1] - y[i]
print(z)

有沒有一種方法可以遍歷多維列表,這些列表具有不是從重塑/排列函數創建的實際值,並且仍然能夠從您執行數學運算的地方對單個單元格執行 boolean 過濾?

我看過 nditer 和 numba,但似乎都在做一個版本,他們轉置二維數組的維度並減少值,這些值只返回 1 個值,而不是數組。

看着你的第一個街區

minus_p_orgp1 = np.append(dif_p_times1, fp, axis=0)
print(minus_p_orgp1)

看起來minus_p_orgp1是一個 (2,6) 數組,只是 2 arrays 的行連接。

for ii, vv in enumerate(minus_p_orgp1):
    print('greater')
    greater_1 = np.all(ii > 0, axis=0)
    greater_0 = np.all(ii <= 0, axis=0)
    if greater_1 < greater_0:
        iit = greater_0 - greater_1
    if greater_1 > greater_0:
        iit = greater_1 - greater_0
        print(iit, ii, vv)

vvminus_p_orgp1的兩行迭代。 ii是 0 和 1 的迭代。所以這個np.all(ii>0...) business is just testing whether ii is 0 or 它在每個循環中設置iit ,但不在任何地方保存值。 在循環結束時它有最后一個值,但那又如何呢?

在下面size是12(2*6),所以np.zeros(11)中的ssss

但是迭代超過 2-1,即它只是計算i=0

ssss = np.zeros(minus_p_orgp1.size - 1)
for i in range(len(minus_p_orgp1) - 1):
    if minus_p_orgp1[i] < minus_p_orgp1[i]:
        ssss[i] = minus_p_orgp1[i + 1] - minus_p_orgp1[i]
    elif minus_p_orgp1[i + 1] > minus_p_orgp1[i]:
        ssss[i] = minus_p_orgp1[i] - minus_p_orgp1[i + 1]
print(ssss)

minus_p_orgp1[i] < minus_p_orgp1[i]是 6 個 False 的數組。 我希望在if子句中使用時會引發ambiguity錯誤。

minus_p_orgp1[i + 1] > minus_p_orgp1[i]更有意義,但仍然不能在elif中使用。 你是在跨列還是跨行?

最初的單詞描述有點含糊,但聽起來您確實只想知道兩個 arrays 之間的正差:

In [68]: x = np.array([1,3,2,4]); y = np.array([2,1,3,3])
In [69]: x-y
Out[69]: array([-1,  2, -1,  1])
In [70]: y-x
Out[70]: array([ 1, -2,  1, -1])
In [71]: np.abs(x-y)
Out[71]: array([1, 2, 1, 1])

一個迭代等價物(同樣適用於列表):

In [72]: z = np.zeros(4, int)
In [73]: for i in range(4):
    ...:     if x[i]>y[i]:
    ...:         z[i] = x[i]-y[i]
    ...:     else:
    ...:         z[i] = y[i]-x[i]
    ...: 
In [74]: z
Out[74]: array([1, 2, 1, 1])

或者簡單地:

In [75]: [abs(i-j) for i,j in zip(x,y)]
Out[75]: [1, 2, 1, 1]

根據 hpaulj 的回答,這有效:

[abs(i-j) for i,j in zip(x,y)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM