【发布时间】:2016-08-12 13:28:47
【问题描述】:
我有一个形状为 (50,8,2048,256) 的 4D 数组 data,它是包含 8 个 2048x256 像素图像的 50 组。 times 是一个形状数组 (50,8),给出了每张图像的拍摄时间。
我为每组中的所有图像计算每个像素的一阶多项式拟合,给我一个形状数组 (50,2048,256,2)。这本质上是 50 个组中每个组的矢量图。我用来存储多项式的代码是:
fits = np.ones((50,2048,256,2))
times = times.reshape(50,8,1).repeat(2048,2).reshape(50,8,2048,1).repeat(256,3)
for group in range(50):
for xpos in range(2048):
for ypos in range(256):
px_data = data[:,:,ypos,xpos]
fits[group,ypos,xpos,:] = np.polyfit(times[group,:,ypos,xpos],data[group,:,ypos,xpos],1)
现在的挑战是我想生成一个形状为 (50,12,2048,256) 的数组 new_data,其中我使用来自 fits 的多项式系数和来自 new_time 的时间来生成 50 组12 张图片。
我想我可以使用 np.polyval(fits, new_time) 之类的东西来生成图像,但我对如何表达它感到很困惑。它应该是这样的:
new_data = np.ones((50,12,2048,256))
for i,(times,fit) in enumerate(zip(new_times,fits)):
new_data[i] = np.polyval(fit,times)
但我收到了广播错误。任何帮助将不胜感激!
更新 好的,所以我稍微更改了代码,以便它可以正常工作并完全按照我的意愿工作,但是所有这些循环都非常慢(每组约 1 分钟,这意味着我需要将近一个小时才能运行!)。谁能建议一种方法来优化它以加快速度?
# Generate the polynomials for each pixel in each group
fits = np.ones((50,2048,256,2))
times = np.arange(0,50*8*grptme,grptme).reshape(50,8)
times = times.reshape(50,8,1).repeat(2048,2).reshape(50,8,2048,1).repeat(256,3)
for group in range(50):
for xpos in range(2048):
for ypos in range(256):
fits[group,xpos,ypos] = np.polyfit(times[group,:,xpos,ypos],data[group,:,xpos,ypos],1)
# Create new array of 12 images per group using the polynomials for each pixel
new_data = np.ones((50,12,2048,256))
times = np.arange(0,50*12*grptme,grptme).reshape(50,12)
times = times.reshape(50,12,1).repeat(2048,2).reshape(50,12,2048,1).repeat(256,3)
for group in range(50):
for img in range(12):
for xpos in range(2048):
for ypos in range(256):
new_data[group,img,xpos,ypos] = np.polynomial.polynomial.polyval(times[group,img,xpos,ypos],fits[group,xpos,ypos])
【问题讨论】:
-
看起来 fit 和 times 都将是多维数组,但
numpy.polyval的文档表明它需要一维数组。您可以查看numpy.polynomial.polynomial.polyval(文档here) -
@Ajean 是的,看起来使用正确的功能,谢谢!但是关于如何将其应用于数据集的任何建议?我想使用组的多项式系数在每组中生成 12 张图像,用于形状数组 (50,12,2048,256)。
标签: python arrays numpy optimization slice