2017-06-03 98 views
2

我有一个NumPy数组有两个维度,所以第一个数组是从1到50和第二个50到150的数字:如何访问具有不同维度的多维NumPy数组的特定行?

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

我想的

print(a[1,:])方式打印例如第二行指定行,

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

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

错误。当我将第二行减少到与第一行相同数量的元素时,它起作用。所以,问题是打印具有不同尺寸的指定行。如果可能,请告诉我如何处理这个问题?谢谢!

+0

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

回答

0

在同一个矩阵的不同行中有不同数量的元素是没有意义的。要解决您的问题,最好首先用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,:] 
+0

非常好的解释,谢谢@Pankaj –

2

拥有不同数量的两个部分元素,你没有得到一个二维数组:

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并构建一个二维数组。

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

+0

是的,我明白了,非常感谢@hpaulj –