Python 和 Numpy 的新手,尝试创建 3 维数组。我的问题是尺寸的顺序与 Matlab 相比是关闭的。事实上,这个顺序根本没有意义。
创建矩阵:
x = np.zeros((2,3,4))
在我的世界中,这应该导致 2 行、3 列和 4 个深度维度,并且应该显示为:
[0 0 0 [0 0 0 [0 0 0 [0 0 0
0 0 0] 0 0 0] 0 0 0] 0 0 0]
在每个深度维度上分开。 相反,它显示为
[0 0 0 0 [0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0] 0 0 0 0]
即 3 行 4 列 2 个深度维度。也就是说,第一个维度是“深度”。为了进一步增加这个问题,使用 OpenCV 导入图像,颜色维度是最后一个维度,也就是说,我将颜色信息视为深度维度。如果我只想在已知较小的 3 维数组上尝试一些东西,这会使事情变得非常复杂。
我是不是误会了什么?如果不是,为什么使用这种不直观的方式处理 3D 维数组是 numpy?
最佳答案
你有一个截断的数组表示。我们来看一个完整的例子:
>>> a = np.zeros((2, 3, 4))
>>> a
array([[[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]],
[[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]]])
NumPy 中的数组打印为单词 array
后跟结构,类似于嵌入式 Python 列表。让我们创建一个类似的列表:
>>> l = [[[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]],
[[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]]]
>>> l
[[[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]],
[[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]]]
这个复合列表的第一级 l
正好有 2 个元素,就像数组 a
的第一个维度(行数)一样。这些元素中的每一个本身都是一个包含 3 个元素的列表,等于 a
的第二维(列数)。最后,最嵌套的列表每个都有 4 个元素,与 a
的第三维(深度/颜色数)相同。
所以你得到了与 Matlab 中完全相同的结构(在尺寸方面),只是以另一种方式打印。
一些注意事项:
Matlab 逐列存储数据(“Fortran 顺序”),而 NumPy 默认逐行存储数据(“C 顺序”)。这不会影响索引,但可能会影响性能。例如,在 Matlab 中,高效循环将在列上进行(例如
for n = 1:10 a(:, n) end
),而在 NumPy 中,最好对行进行迭代(例如for n in range(10): a[n, :]
-- 注意n
在第一个位置,而不是最后一个)。如果您在 OpenCV 中使用彩色图像,请记住:
2.1。它以 BGR 格式存储图像,而不是像大多数 Python 库那样以 RGB 格式存储图像。
2.2。大多数函数适用于图像坐标(
x, y
),与矩阵坐标(i, j
)相反。
关于python - numpy中的3维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22981845/