NumPy认为2-D阵列是1-D

时间:2013-06-10 20:05:55

标签: python numpy

我有一个由文本文件构造的NumPy数组。我已经用这种方式做了几个星期,之前从未见过这个问题。

print data
print data[:, 1:]

输出

[['1', '200', '300', '400', '500\n']
 ['3', '500', '400', '200', '1000\n']
 ['14', '900', '200', '300', '100\n'] ...,
 ['999142', '24', '21', '20', '12\n']]
Traceback (most recent call last):
File ...., line ..., in ....
print data[:, 1:]
IndexError:  too many indices

为什么会发生这种情况,我该如何解决?

编辑:大线索。 data.shape(3313869,),没有第二个值。

data.ndim1

然而,

len(data[1])是5。

编辑,我正在用

构建它
data = [re.split(' ', line) for line in f]
f.close()
data = np.array(data)

当我插话时

f.close()
print data[0:10]

它给出了。

[['1', '200', '300', '400', '500\n'], ['3', .... ]]

2 个答案:

答案 0 :(得分:1)

问题出现了,因为您的代码以某种方式创建了numpy.array个对象。请参阅具有类似问题的this question。当它发生时,你会得到类似的东西:

a = numpyp.array([list1, list2, list3, ... , listn], dtype=object)

这是一个1D数组,但当你要求打印它时会调用每个列表中的__str__,给出:

[[ 1, 2, 3, 4],
 [ 5, 6, 7, 8]]

看起来像是一个2D数组。

您可以模拟它:

a = ['aaa' for i in range(10)]
b = numpy.empty((5),dtype=object)
b.fill(a) 

让我们检查b

b.shape # (5,)
b.ndim  # 1

但是print b给出了:

[['aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa']
 ['aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa']
 ['aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa']
 ['aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa']
 ['aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa']]

相当棘手......

答案 1 :(得分:0)

我用

解决了这个问题
for line in data:
          if (len(line) != 5):
                  print len(line)
                  print line

我的数据中的一些行末尾有空格,这导致500\n被分隔成单独的标记。这个因为周五,我最后一次搞砸了这段代码,我在Python脚本中添加了一个默认选项,为缺少特定值的行构建此脚本的输入文件,并将Vim放入空格换行符上的令牌恰好位于\n之前的角色上。

[re.split(' ', line.replace('\n', '').rstrip()) for line in f]给出欲望结果。

我认为,有点奇怪,NumPy将数组视为1-D和2-D(允许我选择data[1]作为一行)但我想如果这些行不是一致的长度它只是将它看作一个数组而不是二维数组,从而区分两者。