繁体   English   中英

NumPy认为2-D数组是1-D

[英]NumPy thinks a 2-D array is 1-D

我有一个从文本文件构造的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', .... ]]

发生问题是因为您的代码以某种方式创建了对象的numpy.array 请参阅与此问题类似的问题。 发生这种情况时,您会得到类似以下内容的信息:

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

它是一维数组,但是当您要求打印时,它将调用内部每个列表的__str__ ,给出:

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

好像是二维数组

您可以模拟它:

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']]

相当棘手...

我解决了

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将数组同时视为一维和二维数组(允许我选择data[1]作为行)有点奇怪,但是我猜这些行的长度不是一致的,只是将其视为数组的数组而不是二维数组,从而在两者之间进行了区分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM