正确解释numpy形状

hk8txs48  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(114)

我对python中的numpy库很陌生,我想更好地理解基础知识。给定一个numpy数组:

array_example = np.array([[[0, 1, 2, 3],
                           [4, 5, 6, 7]],

                          [[0, 1, 2, 3],
                           [4, 5, 6, 7]],

                          [[0 ,1 ,2, 3],
                           [4, 5, 6, 7]]])

array_example.ndim打印输出3.**我的理解:**这个numpy数组的形状是(3,2,4),因为我已经将形状属性可视化为表示每个维度或每个轴沿着的元素数量。在这种情况下,3个矩阵的阵列(沿着轴0),沿着轴1的2行和沿着轴2的每行中的4个元素。基本上,3D数组的形状元组中的第一个元素应该表示列表中矩阵的数量。

然而,根据文档,在分析图像(https://numpy.org/numpy-tutorials/content/tutorial-svd.html)时,在打开图像作为numpy数组时,返回的形状是(768,1024,3),它应该被读取为3个数组(这里元组中的最后一项表示矩阵的数量),每个形状(768,1024)。

有没有一种可能的方法可以理解满足这两种逻辑的多维numpy数组?

uqzxnwby

uqzxnwby1#

这两种逻辑都是有效的,但它们都没有抓住ndarrayn维数组的核心。你说(3, 2, 4)是“3个2x 4矩阵的列表”,但这只是一个可能的解释。其他解释是:

  • (3, 2, 4)是两个3x 4矩阵的列表
  • (3, 2, 4)是四个3x 2矩阵的列表
  • (3, 2, 4)是4元素数组的3x 2矩阵
  • 等等的。

解释n维数组的方式完全取决于您的用例,特别是 * 您如何访问它 *。例如,您的解释满足以下for循环。

import numpy as np

A = np.random.rand(3,2,4)

for i in range(A.shape[0]):
   print(A[i,:,:])

但是切片是美妙的,因为你可以独立地访问任何维度。例如,如果将矩阵解释为两个3x 4矩阵的列表,则for循环将如下所示:

for i in range(A.shape[1]):
   print(A[:,i,:])

你总是可以通过重塑它来将你提到的图像矩阵转换为 * 你的 * 解释,因为维度可以在n维数组中自由交换。例如,要使n维数组的第二种解释与第一种解释一致,可以执行以下操作:

import numpy as np

A = np.random.rand(768, 1024, 3)
A = A.transpose(2, 0, 1)

print(A.shape) # (3, 768, 1024)

**tl;dr所有的解释都很好,但它们只是 * 解释 *,不应该期望与每个用例都一致。

kq4fsx7k

kq4fsx7k2#

你的理解是完全有效和正确的。dim返回数组维度(轴)的数量,而np.shape返回每个轴的大小。
因此,关于RGB图像的np.数组表示,它的形式是(宽度,高度,通道)。正如你所看到的,channels = 3是最后一个维度,它肯定不会对底层数据产生任何关键影响,你可以转置到(channels,width,height)。现在,这可以简单地读取为像素坐标(前两个轴),然后是其通道(第三个轴)。

相关问题