2

我是 python 新手,并试图从其他 2 个数组中创建第三个数组。我有两个变量(X 和 Y)都与深度有关,但不在完全相同的深度点上。我想检查与 X 相关的深度值,并在数组 Y 中找到深度在 X 深度 50 厘米以内的深度值。然后在第三个数组中返回深度和 Y 值。

我认为'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并且b是 numpy.arrays;i-50. < a计算一个标志数组,1在每个位置的值 > i-50.,然后a[flagarray]只返回标志数组包含 1 的条目。&组合两个标志数组,以便仅提取感兴趣的值. 希望有帮助。

编辑2:类似的东西

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

代码:

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 回答
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 回答