2017-07-31 116 views
0

我確信之前已經有人問過這個問題,但是我找不到我期待的內容。根據另一列的行值創建列。

我有一個np.array,我想創建一個額外的列(C2),其值依賴於另一列(C1)。

在僞代碼中,我想作一列,其中(J = 2:N):

R1C1 = R1C2

IF | RJ-1C2 - RjC1 | < 20 THEN RjC2 = RJ-1C2

否則RjC2 = RjC1

我很新的蟒蛇,但我敢肯定,這是非常簡單的。我基本上只需要知道如何將此公式插入到np.array的python中。

謝謝

回答

0

這是非常具體的。不確定有一個簡單的公式,因爲您遞歸地生成列而不是使用現有數據。你可以做以下,其中a是你的舊列和b的指標是要填寫列的索引:

arr[0, b] = arr[0, a] 
for j in range(1, n): 
    arr[j, b] = arr[j - 1, b] if abs(arr[j - 1, b] - arr[j, a]) < 20 else arr[j, a] 
+0

這很有效。我知道這有點不相關,但是如何將'n'標記爲np.array中的行數? –

+0

'n,_ = arr.shape' – csander

0

我將使用零指數(即0行作爲第一行,第一行是第二行,第0列是第一列,第一列是第二列等),以便於解釋和代碼實現。

邏輯

說我們有一個numpy的數組像這樣(稱之爲陣列a) - 按您的規格,在第一行兩列是相同的。

a = np.array(
    [ 
     [10, 10], 
     [15, None], 
     [50, None] 
    ] 
) 
  • 你要設置n爲3(行數)。
  • 循環變體j取指數1(含)至n(不含)的範圍。對於我們的虛擬示例,j將是1,2。 (即2個循環)

注意numpy的索引看起來像這樣:

  • a[0][1]意味着第一行(行0),第二列(列1)。
  • a[1][1]表示第二行(第1行),第二列(第1列)。

的病症:

  1. if abs(a[j-1][1] - a[j][0]) < 20 ...然後a[j][1] = a[j-1][1]
  2. 否則,a[j][1] = a[j][0]

即預期成果:

[ 
    [10, 10], 
    [15, 10], 
    [50, 50] 
] 

代碼

這是一個直numpy的實施

import numpy as np 

# Create a sample numpy array as per specification 
a = np.array(
    [ 
     [10, 10], 
     [15, None], 
     [50, None] 
    ] 
) 

# get number of rows there are for looping upper bound 
# for our dummy example, n = 3 
n = a.shape[0] 

# do the loop 
for j in range(1, n): 
    if abs(a[j-1][1] - a[j][0]) < 20: 
     a[j][1] = a[j-1][1] 
    else: 
     a[j][1] = a[j][0] 

# the array `a` is now is now updated to...  
# array([[10, 10], 
#  [15, 10], 
#  [50, 50]], dtype=object) 

另外,我建議你重新命名從最初的問題:

創建列基於另一列的行值。

新:

更新列基於其他列的列值。

...因爲你總是隻有兩列(但可以是多行)

相關問題