2017-07-31 61 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) 

另外,我建议你重新命名从最初的问题:

创建列基于另一列的行值。

新:

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

...因为你总是只有两列(但可以是多行)

相关问题