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

时间:2017-11-11 20:53:51

标签: python 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]

4 个答案:

答案 0 :(得分:1)

您可以使用它的预期位置访问单个图像,即 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 ]])

答案 1 :(得分:1)

这只是一个关于什么是正确的'切片的假设的说明。基于其他领域的工作。你需要知道你的形象是怎样的。建成了。在您的情况下,您有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]])

因此,假设什么是正确的'切片'取决于你对阵列构造方式的了解。

答案 2 :(得分:0)

关于arrays的整洁事情是,你可以忘记他们存储的内容,并将其缩小到重要的维度 - first

因此,您可以将问题减少到:

a = np.array([1, 2, 3])

并且您要提取第二个element以及2。现在我们已经用这种方式说明了这个问题,我相信你可以看到它来获得2,我们只是这样做:

a[1]

这很简单!

答案 3 :(得分:0)

我尝试了m[1, :, :]m[1],两者都有效。