2013-01-03 26 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

我的天......我是免费的!非常感谢。我与这个愚蠢的问题斗争的日子已经结束,我终于可以进步了! –

相关问题