【问题标题】:Concatenate numpy arrays in for loop在 for 循环中连接 numpy 数组
【发布时间】:2019-09-11 00:51:28
【问题描述】:

我已将一张图像分成 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)

错误信息:所有输入数组的维数必须相同

我确定这很简单,但我想不通。谢谢。

【问题讨论】:

  • allArrays的形状是什么?

标签: python arrays numpy for-loop numpy-ndarray


【解决方案1】:
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)

在链接的答案中,新数组都是 1d 的,所以从形状 (0,) 开始是可以的。但是wim's 的答案更好 - 将所有数组收集到一个列表中,并在最后进行一个连接。

循环中的重复连接很难正确处理(您必须了解形状和尺寸),并且比列表附加要慢。

【讨论】:

  • 谢谢!对不起,这真的很明显!我使用 allArrays = np.delete(allArrays, slice(0,(len(myArray))), axis=0) 删除串联后的第一个 numpy 数组。
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 2019-01-03
  • 2017-05-05
相关资源
最近更新 更多