我有一個 2d numpy 陣列,稱為arm_resets具有正整數。第一列的所有正整數都小于 360。對于第一列以外的所有列,我需要將超過 360 的所有值替換為第一列中同一行中的值。我認為這將是一件相對容易的事情,這是我所擁有的:
i = 300
over_360 = arm_resets[:, [i]] >= 360
print(arm_resets[:, [i]][over_360])
print(arm_resets[:, [0]][over_360])
arm_resets[:, [i]][over_360] = arm_resets[:, [0]][over_360]
print(arm_resets[:, [i]][over_360])
這是列印的內容:
[3600 3609 3608 ... 3600 3611 3605]
[ 0 9 8 ... 0 11 5]
[3600 3609 3608 ... 3600 3611 3605]
由于第一次列印中顯示的所有數字(前 3 個和最后 3 個)都高于 360,因此它們應該被第三次列印中的第二次列印所取代。為什么這不起作用?
編輯:可重現的例子:
df = pd.DataFrame({"start":[1,2,5,6],"freq":[1,5,6,9]})
periods = 6
arm_resets = df[["start"]].values
freq = df[["freq"]].values
arm_resets = np.pad(arm_resets,((0,0),(0,periods-1)))
for i in range(1,periods):
arm_resets[:,[i]] = arm_resets[:,[i-1]] freq
#over_360 = arm_resets[:,[i]] >= periods
#arm_resets[:,[i]][over_360] = arm_resets[:,[0]][over_360]
arm_resets
鑒于注釋掉的代碼,這里是列印的內容:
array([[ 1, 2, 3, 4, 5, 6],
[ 2, 7, 12, 17, 22, 27],
[ 3, 9, 15, 21, 27, 33],
[ 4, 13, 22, 31, 40, 49]])
我期望的是:
array([[ 1, 2, 3, 4, 5, 1],
[ 2, 2, 2, 2, 2, 2],
[ 3, 3, 3, 3, 3, 3],
[ 4, 4, 4, 4, 4, 4]])
現在,如果有幫助,我實際嘗試創建的最終 2d 陣列是一個 1/0 陣列,指示填充了哪些內容,因此在此示例中,我希望這樣做:
array([[ 0, 1, 1, 1, 1, 1],
[ 0, 0, 1, 0, 0, 0],
[ 0, 0, 0, 1, 0, 0],
[ 0, 0, 0, 0, 1, 0]])
The code I use to achieve this from the above arm_resets is this:
fin = np.zeros((len(arm_resets),periods),dtype=int)
for i in range(len(arm_resets)):
fin[i,a[i]] = 1
uj5u.com熱心網友回復:
切片arm_resets[:, [i]]是一個花哨的索引,因此復制i了資料的第 th 列。arm_resets[:, [i]][over_360] = ...因此呼叫__setitem__一個臨時陣列,該陣列在陳述句執行后立即被丟棄。如果要分配給掩碼,請__setitem__直接呼叫切片物件:
arm_resets[over_360, [i]] = ...
您也不需要將索引制作成串列。使用簡單索引通常更好,尤其是在進行賦值時,因為它們創建視圖而不是副本:
arm_resets[over_360, i] = ...
使用切片,即使以下內容也應該起作用,因為它呼叫__setitem__了一個視圖:
arm_resets[:, i][over_360] = ...
此索引不會幫助您處理資料的每一行,因為它i是一列。事實上,如果您使用索引而不是布爾掩碼,您可以一步處理整個矩陣,而無需回圈。索引有用的原因是您可以匹配第一列中正確行中的專案:
rows, cols = np.nonzero(arm_resets[:, 1:] >= 360)
arm_resets[rows, cols] = arm_resets[rows, 1]
uj5u.com熱心網友回復:
你可以使用 np.where()
first_col = arm_resets[:,0] # first col
first_col = first_col.reshape(first_col.size,1) #Transfor in 2d array
arm_resets = np.where(arm_resets >= 360,first_col,arm_resets)
您可以在此處詳細了解np.where 的作業方式,但基本上它比較 arm_reset >= 360,如果為 true,則將 first_col 值放置到位(此處還有另一個詳細資訊與廣播),如果為 false,則放置 arm_resets 值。
編輯:正如Mad Physicist所建議的那樣。您可以直接使用 arm_resets[:,0,None] 而不是創建 first_col 變數。
arm_resets = np.where(arm_resets >= 360,arm_resets[:,0,None],arm_resets)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/338380.html
