[英]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)
vv
是minus_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.