3

このコードをできるだけ速く実行しようとしていますが、現時点では非常に非効率的です。

スカラー データの 4D 行列があります。4 つの次元は、緯度、経度、高度、時間に対応します。データは numpy 配列に格納され、その形状は (5,5,30,2) です。

4 つの異なるリストで、各軸の「マップ」を保持し、各インデックスに対応する値を格納しています。たとえば、マップ配列は次のようになります。

mapLatitude = [45.,45.2,45.4,45.6,45.8]
mapLongitude = [-10.8,-10.6,-10.4,-10.2,-10.]
mapAltitude = [0,50,100,150,...,1450]
mapTime = [1345673,1345674]

これは、データ マトリックスで、位置 0、1、3、0 のデータ ポイントが
Lat = 45、Lon = -10.6、Alt = 150、Time = 1345673 に対応することを意味します。

ここで、データ マトリックスの各点の座標を含む新しい配列を生成する必要があります。

これまでのところ、これは私が書いたものです:

import numpy as np

# data = np.array([<all data>])
coordinateMatrix = [ 
   (mapLatitude[index[0]],
    mapLongitude[index[1]],
    mapAltitude[index[2]],
    mapTime[index[3]] ) for index in numpy.ndindex(data.shape) ]

これは機能しますが、特にデータ行列のサイズが大きくなると、かなり時間がかかります ( (100,100,150,30) のような形状の行列でこれを使用する必要があります)。

それが役立つ場合は、この座標マトリックスを生成してにフィードする必要がありますscipy.interpolate.NearestNDInterpolator

これをスピードアップする方法に関する提案はありますか?
どうもありがとうございました!

4

1 に答える 1

3

リストを に変換するndarrayと、次のようにブロードキャストを使用できます。

coords = np.zeros((5, 5, 30, 2, 4))
coords[..., 0] = np.array(mapLatitude).reshape(5, 1, 1, 1)
coords[..., 1] = np.array(mapLongitude).reshape(1, 5, 1, 1)
coords[..., 2] = np.array(mapAltitude).reshape(1, 1, 30, 1)
coords[..., 3] = np.array(mapTime).reshape(1, 1, 1, 2)

より一般的な入力の場合、次のようなものが機能するはずです。

def makeCoordinateMatrix(*coords) :
    dims = len(coords)
    coords = [np.array(a) for a in coords]
    shapes = tuple([len(a) for a in coords])
    ret = np.zeros(shapes + (dims,))
    for j, a in enumerate(coords) :
        ret[..., j] = a.reshape((len(a),) + (1,) * (dims - j - 1))
    return ret

coordinateMatrix = makeCoordinateMatrix(mapLatitude, mapLongitude,
                                        mapAltitude, mapTime)
于 2012-12-31T11:47:07.553 に答える