在numpy中重塑ndarray与普通数组的区别?

2 投票
1 回答
1802 浏览
提问于 2025-04-17 11:55

我有一个叫“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

确实,ravelhstack 是重塑数组时很有用的工具:

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]]

或者,给定 ab,或者说 arr[0]arr[1],你可以直接用 hstack 方法来形成 arr

arr = np.hstack([a, b])
# [[ 1  2  3  7  8  9]
#  [ 4  5  6 10 11 12]]

撰写回答