8

ループを使用せずに、並べ替えられていない座標点から値の2D配列を作成する効率的な方法はありますか(つまり、すべてのlonやlatが昇順または降順であるとは限りません)。

サンプルデータ

lats = np.array([45.5,45.5,45.5,65.3,65.3,65.3,43.2,43.2,43.2,65.3])
lons = np.array([102.5,5.5,116.2,102.5,5.5,116.2,102.5,5.5,116.2,100])
vals = np.array([3,4,5,6,7,7,9,1,0,4])

出力例
各列は一意の経度(102.5、5.5、116.2、および100)を表し、各列は一意の緯度(45.5、65.3、および43.2)を表します。

([ 3, 4, 5, NaN],
 [ 6, 7, 7, 4],
 [ 9, 1, 0, NaN])

ただし、配列の形状を決定する各lonまたはlatの複製がいくつあるかは必ずしもわからないため、それほど単純ではありません。

更新:
質問に対してデータが正しく配置されていませんでした。これで配置したので、それらはすべて一意のペアであり、NaNが存在する場合にデータを配置する方法を示す追加のデータポイントがあります。

4

3 に答える 3

5

あなたが投稿した例はほとんど意味がなく、不足しているデータを指定する合理的な方法を許可していません。私はここで推測していますが、あなたが扱っているかもしれない唯一の合理的なことはこのようなもののようです:

>>> lats = np.array([43.2, 43.2, 43.2, 45.5, 45.5, 45.5, 65.3, 65.3, 65.3])
>>> lons = np.array([5.5, 102.5, 116.2, 5.5, 102.5, 116.2, 5.5, 102.5, 116.2])
>>> vals = np.array([3, 4, 5, 6, 7, 7, 9, 1, 0])

の値は緯度と経度にvals[j]由来しますが、データは次のようにスクランブルされている可能性があります。lats[j]lons[j]

>>> indices = np.arange(9)
>>> np.random.shuffle(indices)
>>> lats = lats[indices]
>>> lons = lons[indices]
>>> vals = vals[indices]
>>> lats
array([ 45.5,  43.2,  65.3,  45.5,  43.2,  65.3,  45.5,  65.3,  43.2])
>>> lons
array([   5.5,  116.2,  102.5,  116.2,    5.5,  116.2,  102.5,    5.5,  102.5])
>>> vals
array([6, 5, 1, 7, 3, 0, 7, 9, 4])

これは、次のように配列に配置できます。

>>> lat_vals, lat_idx = np.unique(lats, return_inverse=True)
>>> lon_vals, lon_idx = np.unique(lons, return_inverse=True)
>>> vals_array = np.empty(lat_vals.shape + lon_vals.shape)
>>> vals_array.fill(np.nan) # or whatever yor desired missing data flag is
>>> vals_array[lat_idx, lon_idx] = vals
>>> vals_array
array([[ 3.,  4.,  5.],
       [ 6.,  7.,  7.],
       [ 9.,  1.,  0.]])
于 2013-02-27T19:40:46.320 に答える
1

2D配列を作成する場合、すべての配列は同じ数のポイントを持つ必要があります。これが本当なら、あなたは単にすることができます

out = np.vstack((lats, lons, vals))

編集

私はこれがあなたが求めているものかもしれないと思います、それは少なくともあなたの質問と一致します:)

xsize = len(np.unique(lats))
ysize = len(np.unique(lons))

そしてあなたのデータが非常によく振る舞うなら

out = [vals[i] for i, (x, y) in enumerate(zip(lats, lons))]
out = np.asarray(out).reshape((xsize, ysize))
于 2013-02-27T17:57:03.387 に答える
1
import numpy as np

lats = np.array([45.5,45.5,45.5,65.3,65.3,65.3,43.2,43.2,43.2,65.3])
lons = np.array([102.5,5.5,116.2,102.5,5.5,116.2,102.5,5.5,116.2,100])
vals = np.array([3,4,5,6,7,7,9,1,0,4])


def unique_order(seq): 
    # http://www.peterbe.com/plog/uniqifiers-benchmark (Dave Kirby)
    # Order preserving
    seen = set()
    return [x for x in seq if x not in seen and not seen.add(x)]

unique_lats, idx_lats = np.unique(lats, return_inverse=True)
unique_lons, idx_lons = np.unique(lons, return_inverse=True)
perm_lats = np.argsort(unique_order(lats))
perm_lons = np.argsort(unique_order(lons))

result = np.empty((len(unique_lats), len(unique_lons)))
result.fill(np.nan)
result[perm_lats[idx_lats], perm_lons[idx_lons]] = vals
print(result)

収量

[[  3.   4.   5.  nan]
 [  6.   7.   7.   4.]
 [  9.   1.   0.  nan]]
于 2013-02-27T18:36:39.700 に答える