【问题标题】:How to access specific row of multidimensional NumPy array with different dimension?如何访问具有不同维度的多维 NumPy 数组的特定行?
【发布时间】:2017-11-04 11:58:09
【问题描述】:

我有一个二维的 NumPy 数组,所以第一个数组是从 1 到 50 的数字,第二个是从 50 到 150 的数字:

a =numpy.array([[1,2,3,...,50],[50,51,52...,150]])。

我想打印 only 指定的行,例如通过

打印第二行

print(a[1,:]),

得到[50,51,52...,150],但它显示

    print((a[1,:]))
IndexError: too many indices for array  

错误。当我将第二行减少到与第一行相同数量的元素时,它就起作用了。因此,问题是打印具有不同维度的指定行。如果可能的话,你能告诉我如何处理这个问题吗?谢谢!

【问题讨论】:

  • 打印出a.shape。我怀疑这是一个一维对象数组。甚至看起来数组的长度是不同的。

标签: python numpy multidimensional-array indexing


【解决方案1】:

由于两部分中的元素数量不同,您不会得到二维数组:

In [15]: a1=list(range(1,6))
In [16]: a2=list(range(5,16))
In [17]: a=np.array([a1,a2])
In [18]: a
Out[18]: array([[1, 2, 3, 4, 5], [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]], dtype=object)
In [19]: a[1]
Out[19]: [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
In [20]: a.shape
Out[20]: (2,)

注意dtype。是对象。 a 是一个 2 元素数组,包含 2 个列表。在大多数情况下,它只是您的两个原始列表的列表,并且必须以相同的方式进行索引:

In [21]: [a1,a2]
Out[21]: [[1, 2, 3, 4, 5], [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]]

如果两个组件的长度相同,np.array 会构造一个二维数组。

当您遇到此类问题时,请检查shape 和dtype。仅仅假设这些属性是危险的。打印出来。并注意将不同长度的列表或数组与numpy 混合使用。它最适用于适合整齐规则多维结构的数据。

【讨论】:

    【解决方案2】:

    在同一矩阵的不同行中具有不同数量的元素是没有意义的。要解决您的问题,最好先用 0 或 NA 填充行中所有缺失的元素,以便所有行中的元素数量相等。

    还请查看Numpy: Fix array with rows of different lengths by filling the empty elements with zeros 中的答案。我正在为您的问题实施其中提到的最佳解决方案之一。

    import numpy as np
    def numpy_fillna(data):
    
        lens = np.array([len(i) for i in data])
        mask = np.arange(lens.max()) < lens[:,None]
    
        out = np.zeros(mask.shape, dtype=data.dtype)
        out[mask] = np.concatenate(data)
        return out
    
    a =np.array([range(1,50),range(50,150)])
    data=numpy_fillna(a)
    
    print data[1,:]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 2022-01-25
      • 2011-03-24
      • 1970-01-01
      • 2018-08-13
      • 2011-05-26
      相关资源
      最近更新 更多