Python 亮度图(或图像),其行对应于不同长度的阵列
我将Python与numpy、scipy、matplotlib一起使用 我有两个包含不同长度数组的列表,为了具体起见,我将调用x和y,并说它们看起来像(实际数组的长度约为1000个元素,实际列表的长度约为10到100个数组): 每个x-数组被排序,每个y-数组被相应的x-数组排序,因此len(x[i])==len(y[i])始终为真,x[i][j]始终对应于y[i][j]。每个x阵列的范围在相同的两个值之间(例如,在上述示例中为0和4) 我想制作一个绘图或保存一个图像(如果可能的话,我想知道如何两者都做),其中第I行是y[I]与x[I],亮度对应于y值 例如,在上述示例中:Python 亮度图(或图像),其行对应于不同长度的阵列,python,arrays,numpy,matplotlib,variable-length,Python,Arrays,Numpy,Matplotlib,Variable Length,我将Python与numpy、scipy、matplotlib一起使用 我有两个包含不同长度数组的列表,为了具体起见,我将调用x和y,并说它们看起来像(实际数组的长度约为1000个元素,实际列表的长度约为10到100个数组): 每个x-数组被排序,每个y-数组被相应的x-数组排序,因此len(x[i])==len(y[i])始终为真,x[i][j]始终对应于y[i][j]。每个x阵列的范围在相同的两个值之间(例如,在上述示例中为0和4) 我想制作一个绘图或保存一个图像(如果可能的话,我想知道如何
- 对于整个绘图,x轴将从0变为4(如果我保存图像而不是进行绘图,那么我并不担心在轴上明确显示x值,但我只知道每行的y值对应于从0到4的x值)
- 第一行的中间五分之一为白色,其余为黑色
- 第二排将分为八排,中间一排为黑色,两边为白色,其余为不同的灰色
- 第三行将分为三行,中间三分之一为白色,边缘三分之二为黑色
绘图或图像看起来像是y的图像版本(我不能在没有10个信誉点的情况下发布图像)。一种方法是使用
numpy.repeat
,它会将一维数组的每个元素重复一定次数。例如:
>>> np.repeat([1,2,3,4], 3)
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])
想法是找到所有列表长度的最小公倍数,然后使用np。对每个列表重复,将数组“拉伸”到一个公共长度
更一般地说,您可以使用scipy.interpolate.interp1d
,线性地插值数组的值:
from scipy.interpolate import interp1d
import numpy as np
x = np.array([0, 1, 2, 3, 4])
y = np.array([0, 0, 1, 0, 0])
f = interp1d(x,y)
print f(np.linspace(0,4,10))
其中打印:
[ 0. 0. 0. 0.33333333 0.77777778 0.77777778
0.33333333 0. 0. 0. ]
您可以将interp1d
与kind=“nearest”
一起使用。(使用“最近的”将给出边界处的步骤,看起来像一个展开,但不需要显式地进行,如果长度没有按需要精确分割,也可以合理地近似于所需的值。)这将给出如下结果:
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
import matplotlib.cm as cm
x = [
np.array([0, 1., 2, 3, 4]),
np.array([0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4]),
np.array([0, 2., 4])
]
y = [
np.array([0, 0, 1., 0, 0]),
np.array([1, 0.75, 0.5, 0.25, .25, 0, .5, 0.75, 1]),
np.array([0, 1., 0,])
]
N = 30
xd = np.linspace(0, 4, 30)
data = np.zeros((len(x), N), dtype=np.float)
print data.shape
for i in range(len(x)):
xi, yi = x[i], y[i]
f = interpolate.interp1d(x[i], y[i], kind="nearest")
data[i] = f(xd)
fig, ax = plt.subplots()
i = ax.imshow(data, cmap=cm.gray, interpolation='nearest')
#fig.colorbar(i)
plt.show()
因为输出的x维必须是整数,所以需要一个可以被所有或长度整除的数字。这可能是一个很大的奇数(本例中为45,但在上面的示例中我使用了30作为近似值)。一种完全通用的方法是从补丁构建绘图,尽管这会非常麻烦。如果Python或numpy有任何扩展数组函数,我相信我可以轻松做到这一点。你看过文件了吗?我在谷歌上看到的关于“pad numpy array”的第一个结果是:嗯,我认为这不是我想要的——我可以使所有数组的长度相同,但我需要的是这样做,数组中的值通过延长的数组“分散”,例如,[0,1,2,3,4]>[0,0,1,2,2,3,3,4]。因此,一个拉伸而不是衬垫。我在谷歌上搜索了一些东西,比如“拉伸numpy数组”,但没有找到我想要的。你为什么不包括你想要的最终数组的例子和你想看到的情节的例子好的,我会编辑这篇文章,包括是的,我想这和jme的方法就是我想要的。我会玩这个,看看能不能让它工作,谢谢@user3558855:有很多方法可以做到这一点,我的建议是我所知道的最简单的方法。缺点是,scipy的“最近的”可能不是你想要的。如果你不喜欢这个,你必须更直接地操作它,但是如果你在这里问这个问题,你需要更具体地了解你想要使用的算法。(尽管如此,如果这是您想要使用的,请接受答案,以便我们都知道。)interp1d最终成为了完美的函数。由于我的一些数组很长(100到1000),我跳过了最不常见的多个部分,只将长度设置为最长数组的长度。再次感谢!
[ 0. 0. 0. 0.33333333 0.77777778 0.77777778
0.33333333 0. 0. 0. ]
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
import matplotlib.cm as cm
x = [
np.array([0, 1., 2, 3, 4]),
np.array([0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4]),
np.array([0, 2., 4])
]
y = [
np.array([0, 0, 1., 0, 0]),
np.array([1, 0.75, 0.5, 0.25, .25, 0, .5, 0.75, 1]),
np.array([0, 1., 0,])
]
N = 30
xd = np.linspace(0, 4, 30)
data = np.zeros((len(x), N), dtype=np.float)
print data.shape
for i in range(len(x)):
xi, yi = x[i], y[i]
f = interpolate.interp1d(x[i], y[i], kind="nearest")
data[i] = f(xd)
fig, ax = plt.subplots()
i = ax.imshow(data, cmap=cm.gray, interpolation='nearest')
#fig.colorbar(i)
plt.show()