Python Numpy:将散点图转换为二维阵列

Python Numpy:将散点图转换为二维阵列,python,numpy,matplotlib,scipy,Python,Numpy,Matplotlib,Scipy,假设我有以下几点: 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,

假设我有以下几点:

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()
这给了我以下结果:


在Numpy(或Scipy等)中是否有方法将它们表示为(a,b)2D数组,而不是使用三个数组来获得2D图像?

编辑我在下面保留了我的原始答案,但深入研究了您之前关于同一主题的问题,代码如下所示。请注意,它不会处理重复的值,因此,如果为同一位置分配了多个值,则只会保留其中一个值。而且,这会弄乱散点图的比例,所以像我的原始答案这样的东西可能更适合你所追求的。但无论如何,代码如下:

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]])
原始答案

如果
dataX
dataY
都是整数数组,那么实现将非常简单。但因为它们似乎不一定是,所以您需要进行一些舍入,为此,您需要首先为阵列在每个方向上选择步长,然后您可以执行以下操作:

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。

您希望该数组的结构是什么?你是说你想要一个有点的1和没有点的0的2D数组,还是什么?我不知道你想如何在一个2D数组中变换这三个数组,但是你可以很容易地得到一个3d数组。考虑您的数组名为“代码> MAG< <代码> >代码> >代码< y>代码>,然后<代码> ALLMES=dStad((x.rVEVER),y.rVIEW(),MAG.RVELL())< < /代码>和<代码>散射(x= Alel[[…,0 ],y= Alel[[…,1 ],c= Alel-[…,2 ])< /C> >,将是一个数组,例如“代码> NeWraye< /Cord>,每个轴<代码> [i,j]是来自
dataX
的有序点,
dataY
由来自
dataMag
的相应量级组成这是一个视觉效果(也是我要求的,但没有用)。嗯……我真诚地感谢你的帮助,但我不认为这是我想要的。例如:对于
dataMag[3,4]=777
,值应重新映射到
newArray[0,14]
,因为
dataX[3,4]=83
dataX
中的第一个排序元素)和
dataY[3,4]=0.82
(包括0的
dataY
中的第14个排序元素)。你能解释一下你的想法吗。什么是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。来自未来导入除法的
是为了避免整数的除法被向下舍入,例如,没有导入
3/2==1
和导入
3/2=1.5
。我的天啊……我自由了!非常感谢你。我与这个愚蠢问题斗争的日子结束了,我终于可以进步了!为了满足您的好奇心,绘图只是我需要的数据功能之一。对于其他阵列,需要二维阵列。