我想将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]
,但输出不是我理想的代码。我的代码出了什么问题?
答案 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]]]])