4

私は次のものを持っているとしましょう:

import pyplot as plt
import numpy as np
'''array([[29, 13, 11,  4,  5], #dataMag
       [19, 16, 25,  9, 10],
       [16, 22, 14, 18, 26],
       [ 9, 17,  8,  9, 777]])

array([[205, 338, 380, 428, 228], #dataX
       [199, 546, 430,  95, 374], 
       [418,  85, 260, 236, 241],
       [308, 481, 133, 136,  83]])

array([[ 0.48,  0.83,  0.71,  0.12,  0.],   #dataY
       [ 0.09,  0.  ,  0.7 ,  0.43,  0.54],
       [ 0.58,  0.  ,  0.56,  0.18,  0.25],
       [ 0.96,  0.26,  0.57,  0.  ,  0.82])'''

plt.scatter(x=dataX.flat, y=dataY.flat, c=dataMag.flat, vmin=np.min(dataMag),
            vmax=np.max(dataMag), marker='s', cmap='hot')
plt.show()

次の結果が得られます。 ランダムに生成された画像

3 つの配列を使用して 2D 画像を取得する代わりに、Numpy (または Scipy など) でそれらを (a,b) 2D 配列として表す方法はありますか?

4

1 に答える 1

1

編集私は元の答えを以下に残していますが、同じ主題に関する以前の質問を掘り下げて、あなたが何をしているのかをコードで説明します。繰り返される値は処理されないことに注意してください。そのため、同じ場所に複数の値が割り当てられている場合、そのうちの 1 つだけが保持されます。また、これはあなたの散布図のスケールを台無しにするので、私の元の答えのようなものがあなたが求めているものにより適しているかもしれません. しかし、とにかく、コードは次のとおりです。

x_, x_idx = np.unique(np.ravel(dataX), return_inverse=True)
y_, y_idx = np.unique(np.ravel(dataY), return_inverse=True)
newArray = np.zeros((len(x_), len(y_)), dtype=dataMag.dtype)
newArray[x_idx, y_idx] = np.ravel(dataMag)
>>> newArray
array([[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 777,   0,   0],
       [ 22,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0],
       [  9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,  29,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,  14,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  13,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,  10,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  11,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0,   0],
       [  0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  25,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,  17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [ 16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0]])

元の答え

両方が整数配列の場合dataXdataY実装は非常に簡単です。しかし、必ずしもそうであるとは限らないため、丸めを行う必要があります。そのためには、最初に配列の各方向のステップ サイズを選択する必要があります。次に、次のようなことを行うことができます。

from __future__ import division

x_step, y_step = 25, 0.10
x = np.round(dataX / x_step).astype(int)
y = np.round(dataY / y_step).astype(int)
x_m, x_M = np.min(x), np.max(x)
y_m, y_M = np.min(y), np.max(y)
newArray = np.zeros((x_M - x_m + 1, y_M - y_m + 1), dtype=dataMag.dtype)
newArray[x - x_m, y - y_m] = dataMag

>>> newArray
array([[ 22,   0,   0,   0,   0,   0,   0,   0, 777,   0,   0],
       [  0,   0,   0,   0,   9,   0,   0,   0,   0,   0,   0],
       [  9,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,  19,   0,   0,   0,  29,   0,   0,   0,   0,   0],
       [  5,   0,  18,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,  26,   0,   0,   0,  14,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,  13,   0,   0],
       [  0,   0,   0,   0,   0,  10,   0,  11,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   4,   0,   0,   0,   0,  16,  25,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,  17,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [ 16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0]])

これを行うときは、丸めステップが十分に小さいことを確認して、2 つの値が配列内の同じ位置に丸められないように注意する必要があります。そうすると、情報が失われます。例えば:

x_step, y_step = 50, 0.10
...
>>> newArray
array([[ 22,   0,   0,   0,   9,   0,   0,   0, 777,   0,   0],
       [  9,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0],
       [  0,  19,   0,   0,   0,  29,   0,   0,   0,   0,   0],
       [  5,   0,  26,   0,   0,   0,  14,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9],
       [  0,   0,   0,   0,   0,  10,   0,   0,  13,   0,   0],
       [  0,   0,   0,   0,   0,   0,  16,  11,   0,   0,   0],
       [  0,   4,   0,   0,   0,   0,   0,  25,   0,   0,   0],
       [  0,   0,   0,  17,   0,   0,   0,   0,   0,   0,   0],
       [ 16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0]])

位置[3, 2]には、前の例の対応するセルの 18 と 26 の代わりに、26 のみが表示されます。

于 2013-01-03T23:35:24.280 に答える