我想将2D数组重塑为3D数组

时间:2018-04-27 01:15:57

标签: python numpy

我想将2D数组重塑为3D数组。我编写了代码,

for i in range(len(array)):
    i = np.reshape(i,(2,2,2))
    print(i)

i变量具有偶数个长度数组,如[["100","150","2","4"],["140","120","3","5"]]

[[“1”,”5”,”6”,”2”],[“4”,”2”,”3”,”7”],[“7”,”5”,”6”,”6”],[“9”,”1”,”8”,”3”],[“3”,”4”,”5”,”6”],[“7”,”8”,”9”,”2”],,[“1”,”5”,”2”,”8”],[“6”,”7”,”2”,”1”],[“9”,”3”,”1”,”2”],[“6”,”8”,”3”,”3”]]

长度> = 6。 当我运行此代码时,ValueError:无法将大小为148的数组重塑为形状(2,2,2)错误。 我理想的输出是

[[['100', '150'], ['2', '4']], [['140', '120'], ['3', '5']]] or [[[“1”,”5”],[”6”,”2”]],[[“4”,”2”],[”3”,”7”]],[[“7”,”5”],[”6”,”6”]],[[“9”,”1”],[”8”,”3”]],[[“3”,”4”],[”5”,”6”]],[[“7”,”8”],[”9”,”2”]],[[“1”,”5”],[”2”,”8”]],[[“6”,”7”],[”2”,”1”]],[[“9”,”3”],[[”1”,”2”]],[[“6”,”8”],[”3”,”3”]]] 

我重写了代码y = [[x[:2], x[2:]] for x in i],但输出不是我理想的代码。我的代码出了什么问题?

3 个答案:

答案 0 :(得分:0)

您无需循环重塑您想要的方式,只需使用arr.reshape((-1,2,2))

In [3]: x = np.random.randint(low=0, high=10, size=(2,4))

In [4]: x
Out[4]:
array([[1, 1, 2, 5],
       [8, 8, 0, 5]])

In [5]: x.reshape((-1,2,2))
Out[5]:
array([[[1, 1],
        [2, 5]],

       [[8, 8],
        [0, 5]]])

此方法适用于您的两个阵列。 -1作为第一个参数意味着numpy将推断未知维度的值。

答案 1 :(得分:0)

首先,你错过了重塑的意义。假设您的原点数组具有形状(A,B),并且您想要将其重塑为形状(M,N,O),您必须确保A * B = M * N * O.显然148!= 2 * 2 * 2,对吧?

在您的情况下,您想要将形状(N,4)的数组重新整形为形状数组(N,2,2)。你可以这样做:

x = np.reshape(y, (-1, 2, 2))

希望这有帮助:)

答案 2 :(得分:0)

In [76]: arr = np.arange(24).reshape(3,8)
In [77]: for i in range(len(arr)):
    ...:     print(i)
    ...:     i = np.reshape(i, (2,2,2))
    ...:     print(i)
    ...:     
0
....

AttributeError: 'int' object has no attribute 'reshape'

len(arr)为3,因此range(3)生成值0,1,2。您无法重塑数字0

或者您的意思是重塑arr[0]arr[1]等?

In [79]: for i in arr:
    ...:     print(i)
    ...:     i = np.reshape(i, (2,2,2))
    ...:     print(i)
    ...:     
[0 1 2 3 4 5 6 7]
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
[ 8  9 10 11 12 13 14 15]
[[[ 8  9]
  [10 11]]

 [[12 13]
  [14 15]]]
[16 17 18 19 20 21 22 23]
[[[16 17]
  [18 19]]

 [[20 21]
  [22 23]]]

那是有效的 - 有点像。打印看起来不错,但arr本身不会改变:

In [80]: arr
Out[80]: 
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]])

那是因为i是迭代变量。为其分配新值不会更改原始对象。如果这令人困惑,您需要查看基本的Python迭代。

或者我们可以迭代范围,并将其用作索引:

In [81]: for i in range(len(arr)):
    ...:     print(i)
    ...:     x = np.reshape(arr[i], (2,2,2))
    ...:     print(x)
    ...:     arr[i] = x
    ...: 
    ...: 
    ...: 
    ...:     
0
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-81-5f0985cb2277> in <module>()
      3     x = np.reshape(arr[i], (2,2,2))
      4     print(x)
----> 5     arr[i] = x
      6 
      7 

ValueError: could not broadcast input array from shape (2,2,2) into shape (8)

重塑可以工作,但你不能将(2,2,2)数组放回形状的槽(8,)。元素的数量是正确的,但形状不是。

换句话说,你无法重新塑造一个零碎的数组。你必须重塑整个事情。 (如果arr是一个列表列表,那么这种零碎的重塑就行了。)

In [82]: np.reshape(arr, (3,2,2,2))
Out[82]: 
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]]]])