[英]how to access entire sub array in numpy?
我正在尝试将不同的图像结果存储在多维数组中。 考虑下面的m
具有3个大小为3x4的图像,现在我想访问第二个图像,我正在尝试m[:, :, 1]
。 但这产生了错误的结果。 您能在如何访问子阵列上对我进行纠正吗?
m = np.random.random((3,4,3))
array([[[ 0.72474649, 0.88239477, 0.21834498],
[ 0.3594392 , 0.06462519, 0.43329582],
[ 0.83452734, 0.43937307, 0.61267164],
[ 0.75062416, 0.76516036, 0.35487906]],
[[ 0.90644054, 0.22091564, 0.94508058],
[ 0.20201594, 0.60295539, 0.77998197],
[ 0.10496835, 0.77960017, 0.78249163],
[ 0.53903028, 0.81245971, 0.38983454]],
[[ 0.81369716, 0.89243267, 0.49874087],
[ 0.95248644, 0.0847973 , 0.59074351],
[ 0.24507041, 0.03595347, 0.32902477],
[ 0.48906304, 0.14659161, 0.77392082]]])
m[:, :, 1]
// Actual output
array([[ 0.88239477, 0.06462519, 0.43937307, 0.76516036],
[ 0.22091564, 0.60295539, 0.77960017, 0.81245971],
[ 0.89243267, 0.0847973 , 0.03595347, 0.14659161]])
// Expected output
[ 0.90644054, 0.22091564, 0.94508058],
[ 0.20201594, 0.60295539, 0.77998197],
[ 0.10496835, 0.77960017, 0.78249163],
[ 0.53903028, 0.81245971, 0.38983454]
您可以访问其期望位置的单个图像,即m [0]为您提供第一张图像。
证明:
>>> a = numpy.random.random((3, 4, 3))
>>> a
array([[[ 0.2585421 , 0.6096753 , 0.70295892],
[ 0.50408344, 0.37075371, 0.30463057],
[ 0.76298221, 0.67466292, 0.53305787],
[ 0.63844013, 0.45100157, 0.1346955 ]],
[[ 0.54268873, 0.31534909, 0.40414511],
[ 0.87335605, 0.81278098, 0.12953214],
[ 0.64353518, 0.22347 , 0.63712407],
[ 0.02646421, 0.56478202, 0.57160074]],
[[ 0.36965073, 0.796066 , 0.7289024 ],
[ 0.47232785, 0.43087964, 0.873769 ],
[ 0.12393581, 0.63266617, 0.0935309 ],
[ 0.62007608, 0.77474674, 0.28507152]]])
>>> a[0]
array([[ 0.2585421 , 0.6096753 , 0.70295892],
[ 0.50408344, 0.37075371, 0.30463057],
[ 0.76298221, 0.67466292, 0.53305787],
[ 0.63844013, 0.45100157, 0.1346955 ]])
这只是关于基于其他领域工作的正确“切片”假设的说明。 您需要知道如何构造“图像”。 在您的情况下,您有3张图像,但是在某些字段(GIS和遥感)中,使用3张“图像”从3个色带中构建一个阵列。 可悲的是,元素有优先顺序,但这不是标准的。
例如,考虑在要采取的“正确”切片上构造数组的后果。
三个带的形状均为5、4
red = np.arange(20).reshape(5,4)
green = np.arange(20, 40).reshape(5,4)
blue = np.arange(40, 60).reshape(5,4)
red
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
green
array([[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31],
[32, 33, 34, 35],
[36, 37, 38, 39]])
blue
array([[40, 41, 42, 43],
[44, 45, 46, 47],
[48, 49, 50, 51],
[52, 53, 54, 55],
[56, 57, 58, 59]])
现在可以用3种方式组装它们,有时这取决于您使用的软件...。因此您必须知道数组的构造方式。
rgb_0 = np.stack((red, green, blue), axis=0)
rgb_1 = np.stack((red, green, blue), axis=1)
rgb_2 = np.stack((red, green, blue), axis=2)
最终的数组具有明显不同的形状,但是...记住...我们不知道它们是如何构造的。
rgb_0.shape, rgb_1.shape, rgb_2.shape
((3, 5, 4), (5, 3, 4), (5, 4, 3))
让我们为rgb的3个变体提取“红色”信息
red_0 = rgb_0[0, :, :]
red_1 = rgb_1[:, 0, :]
red_2 = rgb_2[:, :, 0]
生产
np.allclose(red_0, red_1) # True
np.allclose(red_0, red_2) # True
np.allclose(red_0, red_2) # True
red_0
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
因此,假设什么是正确的“切片”取决于您对数组构造方式的了解。
关于整洁的东西arrays
是你可以对他们存储什么忘了,只是缩小它的事项的层面- first
。
因此,您可以将问题减少为:
a = np.array([1, 2, 3])
并且您要提取第二个element
所以2
。 现在我们以这种方式说明了这个问题,我相信您可以看到要得到2
,我们可以这样做:
a[1]
就那么简单!
我试过m[1, :, :]
或m[1]
都可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.