2017-07-31 14 views
0

これまでにこれが尋ねられたと確信していますが、私が探していたものを正確に見つけることができませんでした。別の列の行の値に基づいて列を作成します。

私はnp.arrayを持っており、別の列(C1)に依存する値を持つ追加の列(C2)を作成したいと考えています。擬似コードで

、私は列(J = 2:n)を:したいと思い

R1C1 = R1C2

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

ELSE RjC2 = RjC1

私のpythonに非常に新しいですが、私はこれはかなりまっすぐ進むと確信しています。私は基本的には、この式をPythonにnp.array用に挿入する方法を知る必要があります。

ありがとうございました

答えて

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

これは非常にうまく動作します。これはちょっと関係ないことが分かっていますが、np.arrayの行数に「n」というラベルを付けるにはどうすればよいですか? –

+0

'n、_ = arr.shape' – csander

0

(すなわち行0であります行1は第2行、列0は第1列、列1は第2列など)を使用して、説明およびコード実施を容易にする。

ロジック

は、(配列aそれを呼び出す)私たちは、このようなnumpyの配列を持っていると言う - あなたの仕様に従って、最初の行の両方の列は同じです。

a = np.array(
    [ 
     [10, 10], 
     [15, None], 
     [50, None] 
    ] 
) 
  • あなたは3としてn(行数)を設定します。
  • ルーピングバリアントjは、インデックス1(範囲内)からn(範囲外)までの範囲をとります。ダミーの例では、j1,2となります。 (すなわち、2つのループ)

numpyの索引付けは、次のように見えることに注意してください。

  • a[0][1]は、最初の行(行0)、第二のカラム(COL 1)を意味します。
  • a[1][1]は、第2行(行1)、第2列(列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] 
] 

コード

は、これは私が元からのご質問の名前を変更するために、あなたを示唆し、

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) 

またストレートnumpyの実装です別の列の行の値に基づいて列を作成します。新たに

:別の列の行の値に基づいて

更新カラム。

...常に2つの列しかないので(多くの行になることがあります)