繁体   English   中英

如何在numpy中访问整个子数组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM