Numpy N维数组展开

时间:2017-02-10 18:33:10

标签: python numpy

我基本上试图实现this,但需要以不同的方式展开。我希望连接N-1th维度的所有样本。例如,如果我的展开应用于(100,100,3)的RGB图像,则新阵列基本上将成为(100,300),其中3个颜色通道图像现在并排在新阵列中。

我尝试使用整齐的内置numpy函数(例如flattenconcatenate)没有产生任何结果。 (flatten,因为最终目标是应用此展开,直到它是一维数组)

甚至无法想到在循环中执行此操作的切片方式,因为维度的起始数量不是常数(array = array[:,...,:,0]+...+array[:,...,:,0]

修改

我想出了这种实现我想要的方式,但仍然会欢迎更好,更纯粹的numpy解决方案。

shape = numpy.random.randint(100, size=numpy.random.randint(100))
array = numpy.random.uniform(size=shape)

array = array.T
for i in range(0, len(shape)-1, -1):
    array = numpy.concatenate(array)

1 个答案:

答案 0 :(得分:0)

我是否正确地推断你想要压扁阵列的最后2个维度?

In [96]: shape = numpy.random.randint(10, size=numpy.random.randint(10))+1
In [97]: shape
Out[97]: array([2, 7, 2])
In [98]: newshape=tuple(shape[:-2])+(-1,)
In [99]: arr = np.arange(np.prod(shape)).reshape(shape)
In [100]: arr.shape
Out[100]: (2, 7, 2)
In [101]: arr.reshape(newshape).shape
Out[101]: (2, 14)
In [102]: arr.reshape(newshape)
Out[102]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13],
       [14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]])

如果你不喜欢最后一个维度中的术语顺序,你可能需要转置

In [109]: np.swapaxes(arr, -1,-2).reshape(newshape)
Out[109]: 
array([[ 0,  2,  4,  6,  8, 10, 12,  1,  3,  5,  7,  9, 11, 13],
       [14, 16, 18, 20, 22, 24, 26, 15, 17, 19, 21, 23, 25, 27]])

我无法针对您的代码对其进行测试,因为range(0,len(shape)-1, -1)是一个空范围。

我认为你不想要

In [112]: np.concatenate(arr,axis=-1).shape
Out[112]: (7, 4)
In [113]: np.concatenate((arr[0,...],arr[1,...]), axis=-1)
Out[113]: 
array([[ 0,  1, 14, 15],
       [ 2,  3, 16, 17],
       [ 4,  5, 18, 19],
       [ 6,  7, 20, 21],
       [ 8,  9, 22, 23],
       [10, 11, 24, 25],
       [12, 13, 26, 27]])

将arr分割在第1轴上,然后将其连接到最后一个轴上。