在numpy中重塑ndarray与普通数组的区别?
我有一个叫“myarray”的对象,它的类型是'numpy.ndarray'。当我用Python的“print”命令把它打印出来时,显示的内容是这样的:
[[[ 84 0 213 232] [153 0 304 363]]
[[ 33 0 56 104] [ 83 0 77 238]]
[[ 0 0 9 61] [ 0 0 2 74]]]
这个“myarray”是由另一个库生成的。它的形状(也就是尺寸)用myarray.shape
表示,结果是(3, 2)。我原本以为这应该是一个三维数组,应该有三个索引。但当我自己尝试创建这样的结构时,使用的是:
second_array = array([[[84, 0, 213, 232], [153, 0, 304, 363]],
[[33, 0, 56, 104], [83, 0, 77, 238]],
[[0, 0, 9, 61], [0, 0, 2, 74]]])
我得到的second_array.shape
是(3, 2, 4)
,这正是我预期的。为什么会有这样的差别呢?另外,既然如此,我该如何改变“myarray”的形状,把两列合并,也就是说,想要的结果是:
[[[ 84 0 213 232 153 0 304 363]]
[[ 33 0 56 104 83 0 77 238]]
[[ 0 0 9 61 0 0 2 74]]]
编辑:为了更清楚,我知道在second_array
的情况下,我可以用second_array.reshape((3,8))
来实现。但是对于像myarray
这样的ndarray,它没有三维索引,我该怎么做呢?
myarray.dtype
是"object
",但也可以改成ndarray。
编辑 2:我离目标更近了,但还是无法完全理解ravel
/flatten
后再reshape的过程。我尝试了:
a = array([[1, 2, 3],
[4, 5, 6]])
b = array([[ 7, 8, 9],
[10, 11, 12]])
arr = array([a, b])
我试了:
arr.ravel().reshape((2,6))
但这给出的结果是[[1, 2, 3, 4, 5, 6], ...]
,而我想要的是[[1, 2, 3, 7, 8, 9], ...]
。这该怎么做呢?
谢谢。
1 个回答
3
确实,ravel
和 hstack
是重塑数组时很有用的工具:
import numpy as np
myarray = np.empty((3,2),dtype = object)
myarray[:] = [[np.array([ 84, 0, 213, 232]), np.array([153, 0, 304, 363])],
[np.array([ 33, 0, 56, 104]), np.array([ 83, 0, 77, 238])],
[np.array([ 0, 0, 9, 61]), np.array([ 0, 0, 2, 74])]]
myarray = np.hstack(myarray.ravel()).reshape(3,2,4)
print(myarray)
# [[[ 84 0 213 232]
# [153 0 304 363]]
# [[ 33 0 56 104]
# [ 83 0 77 238]]
# [[ 0 0 9 61]
# [ 0 0 2 74]]]
myarray = myarray.ravel().reshape(3,8)
print(myarray)
# [[ 84 0 213 232 153 0 304 363]
# [ 33 0 56 104 83 0 77 238]
# [ 0 0 9 61 0 0 2 74]]
关于编辑2:
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([[ 7, 8, 9],
[10, 11, 12]])
arr = np.array([a, b])
print(arr)
# [[[ 1 2 3]
# [ 4 5 6]]
# [[ 7 8 9]
# [10 11 12]]]
注意到
In [45]: arr[:,0,:]
Out[45]:
array([[1, 2, 3],
[7, 8, 9]])
因为你想要第一行是 [1,2,3,7,8,9]
,上面的内容说明你希望第二个轴变成第一个轴。你可以用 swapaxes
方法来实现这个:
print(arr.swapaxes(0,1).reshape(2,6))
# [[ 1 2 3 7 8 9]
# [ 4 5 6 10 11 12]]
或者,给定 a
和 b
,或者说 arr[0]
和 arr[1]
,你可以直接用 hstack
方法来形成 arr
:
arr = np.hstack([a, b])
# [[ 1 2 3 7 8 9]
# [ 4 5 6 10 11 12]]