私は、とにかく(つまり、私はそれを求めるために、正確に方法がわからない)私は右の命名法を持っていないかもしれないので、この上で何かを見つけることができていますが、していません3D numpy配列 "a"を持つ。私は、a = 0の2Dサーフェスを特定しプロットしたいと思います。明確にするために、データは、3D空間上で滑らかに変化する倍精度浮動小数です。面A = 0は、アレイのポイントではなく、「間のスレッドは、」正確にそれらのいずれかに右にある可能性が高いです。ですから、a = 0のサーフェスを見つけてプロットするために補間できるものが必要です。 matplotlibにはこれを行うための既製のルーチンがありますか?matplotlibの2次元スライス
答えて
"a = 0"の2Dサーフェスを特定してプロットするには、a=0
とplot(下に表示)のデータをサブセット化するだけです。データをその平面に投影する場合は、少し複雑です。
threeD = np.array([(x,y,z) for x in [0,1] for y in [1,2] for z in [5,6]])
twoD = np.array([(y,z) for (x,y,z) in threeD if x==0])
y,z = zip(*twoD)
plt.plot(y,z, 'o')
plt.xlim(0,3)
plt.ylim(0,7)
私の質問は十分にはっきりしていないと思います。編集中。 –
ボリュームスライシング操作は、通常、補間の概念に依存しており、最も一般的には、次のとおりNearest neighbor、Linear、及びCubic。これらの方法は寸法のさらなる数(例えばBilinear又はTrilinear補間を参照)に適合している注意してください。
このケースでは、X、Y、Zのスライスを取得できるボリュームがあると言っています(またはハイブリッドですが、新しい問題全体からこのケースを考慮せず混乱させます)。
そう考えると、一例として、スライスX = 5とX = 6あなたはX = 5.5取得する方法を知りたいです。例に見てみましょう:
def linear_interpolation(p1, p2, x0):
"""
Function that receives as arguments the coordinates of two points (x,y)
and returns the linear interpolation of a y0 in a given x0 position. This is the
equivalent to obtaining y0 = y1 + (y2 - y1)*((x0-x1)/(x2-x1)).
Look into https://en.wikipedia.org/wiki/Linear_interpolation for more
information.
Parameters
----------
p1 : tuple (floats)
Tuple (x,y) of a first point in a line.
p2 : tuple (floats)
Tuple (x,y) of a second point in a line.
x0 : float
X coordinate on which you want to interpolate a y0.
Return float (interpolated y0 value)
"""
return p1[1] + (p2[1] - p1[1]) * ((x0 - p1[0])/(p2[0] - p1[0]))
X, Y, Z = np.meshgrid(range(10), range(10), range(10))
vol = np.sqrt((X-5)**2 + (Y-5)**2 + (Z-5)**2)
Slice5dot5 = linear_interpolation((Y[5, :, :], vol[5, :, :]), (Y[6, :, :], vol[6, :, :]), 5.5)
f, (ax1, ax2, ax3) = plt.subplots(1, 3, sharey=True)
ax1.imshow(vol[5, :, :], interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max())
ax1.set_title("vol[5, :, :]")
ax2.imshow(Slice5dot5, interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max())
ax2.set_title("vol[5.5, :, :]")
ax3.imshow(vol[6, :, :], interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max())
ax3.set_title("vol[6, :, :]")
plt.show()
機能は、(私は古いプロジェクトのその一部)に文書番号を使用することが、それはnumpyの2Dスライスと同じようにうまく動作します(と、それは非常になります表示されますすべてのセルをループするよりも速い)。
結果は、このでした:
あなたは、左から右に淡い色を得ることに気づくでしょう。中央のスライスは完全に補間され、以前は存在しませんでした。あなたはボリュメトリックデータに平面と非線形スライスの両方をプロットすることができPlotlyで
- 1. C#の2次元配列スライス
- 2. ヒートマップ2次元散布行列matplotlib
- 3. 多次元配列スライス
- 4. numpyスライスを2次元配列に追加して3次元にします
- 5. 文字列の2次元配列のスライス
- 6. 1列から2次元のパンダをスライスするDataFrame
- 7. 2次元numpy配列の境界を整数値でスライス
- 8. Xarray:次元のないスライス座標
- 9. 2次元画像スライスに沿った補間
- 10. 2次元アレイからスライス列を移動しますか?
- 11. スライスと再インデックス多次元データセット
- 12. Python:多次元配列をスライスする
- 13. 2次元多重線形回帰のmatplotlib plot_surface
- 14. 各スレッドが最初の次元で独自のインデックスを取得する2次元スライスのスレッドセーフ
- 15. matplotlib 2.xで3次元線幅を設定する
- 16. 3次元矩形はmatplotlibの
- 17. mySQL、2次元の1次元へ
- 18. numpyで2次元配列の行スライスをゼロにする方法は?
- 19. Numpy - 配列から2次元の行または列ベクトルをスライスする
- 20. 2次元フィルタアルゴリズム
- 21. 2次元ジッパー
- 22. "2次元" UserControl
- 23. 2次元ビンパッキング
- 24. 2次元エラー
- 25. 2次元配列の2次元配列をPHPで
- 26. 3次元配列をループし、2回スライスをN回追加します
- 27. 2次元リストJava
- 28. 2次元配列
- 29. 2次元配列
- 30. N 2次元アレイ
これは、私はあなたがボリュームスライサーをしたいと考えているnumpyのscipyのダウンロードまたは事 – kilojoules
のより多くのように思えます。 numpy、scipy、matplotlib(私が知る限り)は、デフォルトでこれを行う準備ができていません。あなたは層の間にスライスを計算することはできますが(これがあなたに受け入れられるならば、私は解決策を提示してみてください)それを行うためのコードをビルドする必要があります。それをmatplotlibのに近いライブラリーはそれがMayavi(私は今ためのPython 2.xでそののみ利用可能だと思う)で行います。 pyQtGraph、VTK、Vispyも考えてみることができます。 – armatita
@armatita答えに感謝します。少なくとも今私は何か些細なことを聞いていないことを確かに知っている!ボリュームスライシングを行うことができるコードを作成したいのであれば、私は確かにそれを見ることに興味があるでしょう!ありがとう。 –