2

私はPythonが初めてで、他の2つの配列から3番目の配列を作成しようとしています。深度に関連する 2 つの変数 (X と Y) がありますが、まったく同じ深度ポイントではありません。X に関連付けられた深さの値を調べて、X の深さの 50 cm 以内の深さを持つ配列 Y を見つけます。次に、深さと Y の値を 3 番目の配列で返します。

「for」ループがこれを行う可能性があると思いましたが、方法がわかりません。

コード:

A = np.genfromtxt('file.txt', names=True)
B = np.genfromtxt('file2.txt', names=True)

Depth1 = A['Depth']
X = A['variable1']

Depth2 = B['Depth']
Y = B['number']

A には 806 行、B には 456 行が含まれます。

A をフィルター処理し、B の各深度ポイントから 50cm 以内に対応する値 (深度と X の両方) を、できれば別の配列に抽出したいと考えています。

これどうやってするの?オンラインで検索すると、リストは for ループでカバーされているが、配列はカバーされていないことがわかりました。

サンプルデータ:

A = [(0.6, 1.463) (0.95, 1.468) (1.7, 1.465) (2.5, 1.502) (265.38, 1.715) ... (Depth1, X)]
B = [(0.58, 0.726) (0.93, 0.688) (1.69, 0.713) (2.48, 0.606) ... (Depth2, Y)]

サンプル出力:

C = [(0.58, 1.463) (0.93, 1.468) (1.69, 1.465) ... (Depth2, X)]
4

3 に答える 3

1
depths = [a[(i-50. <= a) & (a <= i+50.)] for i in b]

編集:コメントに応じて、それは起こっていることではありません。aそしてbnumpy.arraysです。は、値が > i-50 である各位置i-50. < aのフラグ配列に評価され、フラグ配列に 1 が含まれるエントリのみが返されます。は、2 つのフラグ配列を組み合わせて、目的の値のみを取得します。 . それが役立つことを願っています。1a[flagarray]&

Edit2:のようなもの

result = []
for i,n in zip(depth2,y):
    mask = (i-50. <= a) & (a <= i+50.)
    result.append((n, depth1[mask], x[mask]))

Edit3: B 深度ごとに、単一の値 (最も近い対応する A 深度のラベル) が必要なように見えますか?

import numpy as np

a = np.array([[0.6, 1.463], [0.95, 1.468], [1.7, 1.465], [2.5, 1.502], [265.38, 1.715]])
b = np.array([[0.58, 0.726], [0.93, 0.688], [1.69, 0.713], [2.48, 0.606]])

d1 = a[:,0]
x = a[:,1]

d2 = b[:,0]
y = b[:,1]

def find_index_of_nearest_value(array, value):
    return np.abs(array - value).argmin()

c = [(d, x[find_index_of_nearest_value(d1, d)]) for d,y in b]

結果は

[(0.58, 1.463), (0.93, 1.468), (1.69, 1.465), (2.48, 1.502)]

これは、深度配列を並べ替えて昇順で処理することで高速化できますが、値が 1000 未満の場合は十分に高速です。

于 2012-07-03T22:05:28.830 に答える
0

区分関数を使用できます。たとえば、4 より大きく 6 より小さい配列内のすべての項目を検索するには、次のようにします。

n = numpy.array(range(10))
n = numpy.piecewise(n, [ n<4, n>6 ], [0, 0, lambda x: x])
n.sort()[::-1]

このアプローチは結果をフィルタリングせず、代わりに意図しない結果をゼロに設定します。これには、numpy 内にとどまるという利点があり、パフォーマンスが向上します。

于 2012-07-03T22:14:39.513 に答える
0

コード:

A = [(0.6, 1.463), (0.95, 1.468), (1.7, 1.465), (2.5, 1.502), (265.38, 1.715)]
B = [(0.58, 0.726), (0.93, 0.688), (1.69, 0.713), (2.48, 0.606)]

tolerance = 0.5 
print "\nTolerance: {0}\n".format(tolerance)

for b in B:
    print "B value: {0}".format(b)
    a_vals = [a for a in A if (b[0] + tolerance) > a[0] > (b[0] - tolerance)]
    print "  A values: {0}".format(a_vals) 

出力:

Tolerance: 0.5

B value: (0.58, 0.726)
  A values: [(0.6, 1.463), (0.95, 1.468)]
B value: (0.93, 0.688)
  A values: [(0.6, 1.463), (0.95, 1.468)]
B value: (1.69, 0.713)
  A values: [(1.7, 1.465)]
B value: (2.48, 0.606)
  A values: [(2.5, 1.502)]
于 2012-07-03T22:37:05.180 に答える