np.shape[::-1] dims 和 np.moveaxis 拆分数组的反转

数据挖掘 麻木的
2022-02-21 18:30:48

我在文档中找不到任何内容,但它被用于我在学校上课的一些入门代码中。根据下面的测试,它似乎颠倒了 numpy 数组的维度顺序。

pic = np.ones((3,4,5))
print(pic.shape,"\n", pic)
#new_shape is the reverse of pic.shape
new_shape = pic.shape[::-1]
print(new_shape)

这输出:

(3, 4, 5) 
 [[[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]]
(5, 4, 3)

在入门代码中,它是这样使用的:

res_img = cv2.resize(img, sub_img.shape[::-1])

启动代码中还植入了一些其他技巧(我猜想是为了向我们展示它们的存在)。这是另一个例子:

channels = blue, green, red = np.moveaxis(color_img, 2, 0) #move channels to pos 0

np.moveaxis()通道移动到第一个暗淡位置,但通过 Python 多重分配同时分配给蓝色、绿色和红色?当我查找多项作业时,我只看到了类似var1, var2 = 1, 2. np.moveaxis()返回一个具有新形状的数组,所以我必须扩展我的想象力来假设第一个轴可以分配给变量。它是否正确?

我的导师刚刚回答说进行np.split()了拆分,但文档没有说明在调用时隐式调用它的任何内容np.moveaxis()

有谁知道到底发生了什么?

1个回答

请注意,当您这样做时:

pic.shape[::-1]

你只反转形状的元素是图片。pic.shape反过来,它(3,4,5](5, 4, 3)。

多重赋值所发生的只是您可以将第一个索引沿线的元素分配给各个变量。例如:

pic = np.array( [['x1','x2','x3'],['y1','y2','y3']]) 

第一个索引可以是 0 或 1,第二个索引可以是 0、1 或 2。我可以将 x 向量分配给 a,y 向量如下所示:

a, b = pic

In [18]: a
Out[18]: array(['x1', 'x2', 'x3'], dtype='<U2')
In [19]: b
Out[19]: array(['y1', 'y2', 'y3'], dtype='<U2')

moveaxis通过将轴 0 移动到轴数组中的位置 2 来重新格式化图像的调用。我的图片没有位置 2(因为它只有 2 个维度),但我可以将轴 0 与轴 1 交换:

In [11]: np.moveaxis(pic, 1, 0)
Out[11]: 
array([['x1', 'y1'],
   ['x2', 'y2'],
   ['x3', 'y3']], dtype='<U2')

现在我可以分配(x1, y1)a(x2, y2)b(x3, y3)c

a, b, c = np.moveaxis(pic, 1, 0)

In [14]: a
Out[14]: array(['x1', 'y1'], dtype='<U2')

这里没有split任何地方的呼叫。我认为让您感到困惑的是来自 numpy 数组的多重赋值,它允许将列直接分配给单个变量。结合moveaxis这将允许您在单个命令中拆分红色、绿色和蓝色图像。