在 for 循环中连接 numpy 数组
Concatenate numpy arrays in for loop
我已将一幅图像拆分为 16 个数字来绘制回归图,现在我想将它们重新组合成一个图像。
我已经编写了一个 for 循环来执行此操作,但我无法理解 previous questions 的建议以及我哪里出错了。请有人解释为什么我的输入数组没有相同的维数。
from scipy import interpolate
allArrays = np.array([])
for i in range(len(a)):
fig = plt.figure()
ax = fig.add_axes([0.,0.,1.,1.])
if np.amax(a[i]) > 0:
x, y = np.where(a[i]>0)
f = interpolate.interp1d(y, x)
xnew = np.linspace(min(y), max(y), num=40)
ynew = f(xnew)
plt.plot(xnew, ynew, '-')
plt.ylim(256, 0)
plt.xlim(0,256)
fig.canvas.draw()
X = np.array(fig.canvas.renderer._renderer)
myArray = color.rgb2gray(X)
print(myArray.shape)
allArrays = np.concatenate([allArrays, myArray])
print(allArrays.shape)
else:
plt.xlim(0,256)
plt.ylim(0,256)
fig.canvas.draw()
X = np.array(fig.canvas.renderer._renderer)
myArray = color.rgb2gray(X)
print(myArray.shape)
allArrays = np.concatenate([allArrays, myArray])
print(allArrays.shape)
i += 1
输出:myArray.shape (480, 640)
错误消息:所有输入数组的维数必须相同
我确定这很简单,但我想不通。谢谢
In [226]: allArrays = np.array([])
In [227]: allArrays.shape
Out[227]: (0,)
In [228]: allArrays.ndim
Out[228]: 1
In [229]: myArray=np.ones((480,640))
In [230]: myArray.shape
Out[230]: (480, 640)
In [231]: myArray.ndim
Out[231]: 2
在大多数世界中 1 不等于 2!
要在默认轴 0 上与 myArray
连接,allArrays
必须从 np.zeros((0,640), myArray.dtype)
开始。在 n
次迭代后,它将增长到 (n*480, 640)
。
在链接的答案中,新数组都是一维的,所以从形状 (0,)
开始就可以了。但是 wim's
答案更好 - 将所有数组收集到一个列表中,并在最后进行一个连接。
在循环中重复连接很难正确(你必须了解形状和尺寸),而且比列表追加慢。
我已将一幅图像拆分为 16 个数字来绘制回归图,现在我想将它们重新组合成一个图像。
我已经编写了一个 for 循环来执行此操作,但我无法理解 previous questions 的建议以及我哪里出错了。请有人解释为什么我的输入数组没有相同的维数。
from scipy import interpolate
allArrays = np.array([])
for i in range(len(a)):
fig = plt.figure()
ax = fig.add_axes([0.,0.,1.,1.])
if np.amax(a[i]) > 0:
x, y = np.where(a[i]>0)
f = interpolate.interp1d(y, x)
xnew = np.linspace(min(y), max(y), num=40)
ynew = f(xnew)
plt.plot(xnew, ynew, '-')
plt.ylim(256, 0)
plt.xlim(0,256)
fig.canvas.draw()
X = np.array(fig.canvas.renderer._renderer)
myArray = color.rgb2gray(X)
print(myArray.shape)
allArrays = np.concatenate([allArrays, myArray])
print(allArrays.shape)
else:
plt.xlim(0,256)
plt.ylim(0,256)
fig.canvas.draw()
X = np.array(fig.canvas.renderer._renderer)
myArray = color.rgb2gray(X)
print(myArray.shape)
allArrays = np.concatenate([allArrays, myArray])
print(allArrays.shape)
i += 1
输出:myArray.shape (480, 640)
错误消息:所有输入数组的维数必须相同
我确定这很简单,但我想不通。谢谢
In [226]: allArrays = np.array([])
In [227]: allArrays.shape
Out[227]: (0,)
In [228]: allArrays.ndim
Out[228]: 1
In [229]: myArray=np.ones((480,640))
In [230]: myArray.shape
Out[230]: (480, 640)
In [231]: myArray.ndim
Out[231]: 2
在大多数世界中 1 不等于 2!
要在默认轴 0 上与 myArray
连接,allArrays
必须从 np.zeros((0,640), myArray.dtype)
开始。在 n
次迭代后,它将增长到 (n*480, 640)
。
在链接的答案中,新数组都是一维的,所以从形状 (0,)
开始就可以了。但是 wim's
答案更好 - 将所有数组收集到一个列表中,并在最后进行一个连接。
在循环中重复连接很难正确(你必须了解形状和尺寸),而且比列表追加慢。