如何减少numpy数组的维数?

10

我从一个mxnxp数组开始。

In [16]: A
Out[16]: 
array([[[  2.10000000e+01,   3.70060693e-01],
        [  2.00000000e+01,   2.15659121e-01],
        [  1.50000000e+01,   1.35009735e-01],
        [  2.30000000e+01,   1.15997981e-01],
        [  2.20000000e+01,   7.02226670e-02],
        [  1.60000000e+01,   3.96571639e-02],
        [  2.50000000e+01,   1.64442373e-02],
        [  2.40000000e+01,   1.29001995e-02],
        [  1.20000000e+01,   8.15782143e-03],
        [  4.00000000e+00,   6.13186659e-03],
        [  7.00000000e+00,   5.95704145e-03],
        [  1.00000000e+00,   2.66991888e-03],
        [  6.00000000e+00,   1.39767193e-04],
        [  3.00000000e+00,   1.07608518e-04],
        [  1.90000000e+01,   1.02427053e-04],
        [  1.30000000e+01,   1.00084545e-04],
        [  1.10000000e+01,   9.35799784e-05],
        [  9.00000000e+00,   8.64687546e-05],
        [  8.00000000e+00,   8.20845769e-05],
        [  2.70000000e+01,   7.61546973e-05],
        [  1.40000000e+01,   7.41430049e-05],
        [  1.80000000e+01,   6.78797119e-05],
        [  1.00000000e+01,   6.02706017e-05],
        [  1.70000000e+01,   4.80705068e-05],
        [  2.60000000e+01,   4.39569061e-05],
        [  2.00000000e+00,   3.49337884e-05],
        [  5.00000000e+00,   1.41243870e-05]],

       [[  2.00000000e+01,   5.12832239e-01],
        [  2.10000000e+01,   2.50467388e-01],
        [  1.20000000e+01,   8.93222985e-02],
        [  1.00000000e+00,   2.17633761e-02],
        [  1.70000000e+01,   1.68455794e-02],
        [  4.00000000e+00,   1.55807665e-02],
        [  2.20000000e+01,   1.51387993e-02],
        [  2.30000000e+01,   1.34972674e-02],
        [  1.60000000e+01,   1.14371791e-02],
        [  6.00000000e+00,   8.99163916e-03],
        [  1.50000000e+01,   8.58543707e-03],
        [  2.60000000e+01,   8.42629684e-03],
        [  1.30000000e+01,   8.05955820e-03],
        [  1.90000000e+01,   5.19301656e-03],
        [  2.40000000e+01,   5.06486482e-03],
        [  2.00000000e+00,   3.99051461e-03],
        [  1.00000000e+01,   3.97385580e-03],
        [  2.50000000e+01,   9.76157597e-05],
        [  3.00000000e+00,   9.24458526e-05],
        [  7.00000000e+00,   9.17936963e-05],
        [  8.00000000e+00,   9.17617111e-05],
        [  1.10000000e+01,   9.03015260e-05],
        [  2.70000000e+01,   8.75101021e-05],
        [  1.40000000e+01,   8.27902640e-05],
        [  9.00000000e+00,   7.88132804e-05],
        [  1.80000000e+01,   6.67699579e-05],
        [  5.00000000e+00,   5.01210508e-05]]])
在这种情况下,(2, 27, 2)
In [17]: A.shape
Out[17]: (2, 27, 2)

我想从第三个维度中只获取1st元素,所以我尝试使用切片,但第三个维度仍然存在。

(编辑:最初我错误地写了我想要2nd元素。)

In [18]: A[:,:,:1]
Out[18]: 
array([[[ 21.],
        [ 20.],
        [ 15.],
        [ 23.],
        [ 22.],
        [ 16.],
        [ 25.],
        [ 24.],
        [ 12.],
        [  4.],
        [  7.],
        [  1.],
        [  6.],
        [  3.],
        [ 19.],
        [ 13.],
        [ 11.],
        [  9.],
        [  8.],
        [ 27.],
        [ 14.],
        [ 18.],
        [ 10.],
        [ 17.],
        [ 26.],
        [  2.],
        [  5.]],

       [[ 20.],
        [ 21.],
        [ 12.],
        [  1.],
        [ 17.],
        [  4.],
        [ 22.],
        [ 23.],
        [ 16.],
        [  6.],
        [ 15.],
        [ 26.],
        [ 13.],
        [ 19.],
        [ 24.],
        [  2.],
        [ 10.],
        [ 25.],
        [  3.],
        [  7.],
        [  8.],
        [ 11.],
        [ 27.],
        [ 14.],
        [  9.],
        [ 18.],
        [  5.]]])

基本上,我想要一个没有第三维的2x27数组,因为在我的情况下,第三维只有一个元素。


1
使用 A[:,:,0]A[:,:,1] 来获取一个低维切片。 - Warren Weckesser
更多示例请访问:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html#indexing-slicing-and-iterating - Warren Weckesser
使用切片索引,如:1可以保留维度,使用标量索引,如0则会减少维度。 - hpaulj
3个回答

28

您可以使用numpy.squeeze()函数。

x = np.array([[[0], [1], [2]]])
x.shape
(1, 3, 1)
np.squeeze(x).shape
(3,)
np.squeeze(x, axis=(2,)).shape
(1, 3)

4

我偶然发现了 A.reshape(1,27,1),一开始没有保留大小就运行了

ValueError: total size of new array must be unchanged

在进行reshape时,由于错误操作,我无意中尝试省略了第三个维度。

In [21]: A[:,:,:1].reshape(2,27)
Out[21]: 
array([[ 21.,  20.,  15.,  23.,  22.,  16.,  25.,  24.,  12.,   4.,   7.,
          1.,   6.,   3.,  19.,  13.,  11.,   9.,   8.,  27.,  14.,  18.,
         10.,  17.,  26.,   2.,   5.],
       [ 20.,  21.,  12.,   1.,  17.,   4.,  22.,  23.,  16.,   6.,  15.,
         26.,  13.,  19.,  24.,   2.,  10.,  25.,   3.,   7.,   8.,  11.,
         27.,  14.,   9.,  18.,   5.]])

神奇的是,第三个维度消失了。

这正是我想要的。


5
好的,收到。针对你原来的问题,我认为A[:,:,1](去掉最后一个冒号)可以得到你需要的形状为(2, 27)的数组。 - m3wolf
@m3wolf 我认为应该是 A[:, :, 0],因为 :1 是从 0 开始计数并留出了索引 1... - Praveen
他说他想要第三维的第二个元素,那应该是A[:,:,1]对吧? - m3wolf
@m3wolf @Praveen 感谢你们的建议。很抱歉我不小心写成了“2nd”,现在已经改正了。我认为你们的建议比我使用reshape()更好。 - HeyWatchThis

0
如果你只想获取第三维度中的一个元素,那么这段代码将自动返回只有二维度:
    B = A[:,:,0]
    print(B.shape)

(2,27)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接