2013-01-03 61 views
3

說我有以下幾點:NumPy的:打開散點圖成一個二維數組

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() 

這給了我下面的結果: random generated image

而不是使用三個陣列來獲得2D圖像,是在Numpy(或Scipy等)中有沒有將它們表示爲(a,b)2D數組的方法?

+0

你想要那個數組的結構是什麼?你是說你想要一個1s的二維數組,哪裏會有點和0點,哪裏沒有點,或什麼? – BrenBarn

+0

我不明白你想如何將這三個數組轉換成單個二維數組,但你可以很容易地獲得一個3d數組。考慮你的數組命名爲'mag','x'和'y',那麼'allthem = dstack((x.ravel(),y.ravel(),mag.ravel()))'和'scatter(x = allthem [...,0],y = allthem [...,1],c = allthem [...,2])'。 – mmgp

+0

它將是一個數組,如'NewArray',每個軸'[i,j]'是來自'dataX'的有序點,'dataY'由來自'dataMag'的相應量值構成。 [這裏](http://stackoverflow.com/questions/14085169/numpy-fast-re-map-3d-scatterplot-into-a-2d-array-given-the-xy-arrays)'視覺(也問由我無濟於事)。 –

回答

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]]) 

當你這樣做時,你必須小心謹慎,確保你的舍入步驟足夠小,以避免數組中的相同位置沒有兩個值,因爲那樣會丟失信息。例如:

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]位置只有一個圖26示出,而不是在前面的例子中的相應的細胞中的18和26向上。

+0

嗯...我真誠地感謝你的幫助,但我不認爲這就是我要找的。例如:對於'dataMag [3,4] = 777',自dataX [3,4] = 83'(dataX中的第一個排序元素)之後,該值應重新映射到'newArray [0,14] ')和'dataY [3,4] = 0.82'('dataY'中包含0的第14個排序元素)。你能否向你解釋一下。什麼是'__future__'? –

+1

@NoobSaibot在閱讀完上一個問題之後,我編輯了我的答案,它現在可以完成您的工作,儘管我很難弄清楚爲什麼要將它作爲散點圖的數組版本,但這不是我的商業。 'from__future__進口部門'是爲了避免劃分整數,例如,沒有那個導入'3/2 == 1'和它'3/2 = 1.5'。 – Jaime

+0

我的天......我是免費的!非常感謝。我與這個愚蠢的問題鬥爭的日子已經結束,我終於可以進步了! –

相關問題