尝试对数组进行切片会导致“数组索引过多”。我可以填充阵列来解决这个问题吗?
Posted
技术标签:
【中文标题】尝试对数组进行切片会导致“数组索引过多”。我可以填充阵列来解决这个问题吗?【英文标题】:trying to slice array results in "Too many indices for array". Can I pad the array to fix this? 【发布时间】:2020-03-26 13:04:12 【问题描述】:我已经看到了很多关于这个特定错误的问题。我相信我的问题足够不同,足以保证它自己的帖子。
我的目标:我正在构建一个生成新闻标题的 RNN。它将根据之前出现的单词预测下一个单词。此代码来自example,我正在尝试对其进行调整以适应我的情况。我正在尝试将数组分割成X
和y
。
问题:
我知道出现错误是因为数组被索引,就好像它是一个二维数组,但它实际上是一个一维数组。在将sequences
转换为数组之前,它是一个列表列表,但并非所有嵌套列表的长度都相同,因此 numPy 将其转换为一维数组。
我的问题: 有没有一种简单或优雅的方式来填充sequences
以使所有列表的长度相同?我可以使用空格在较短的标题中保持相同的含义吗?为什么我需要将列表列表更改为数组?正如我之前所说,这是来自一个例子,我试图了解他们做了什么以及为什么。
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Pretreat Data Section
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
# integer encode sequences of words
# create the tokenizer
t = Tokenizer()
# fit the tokenizer on the headlines
t.fit_on_texts(headlines)
sequences = t.texts_to_sequences(headlines)
# vocabulary size
vocab_size = len(t.word_index) + 1
#separate into input and output
sequences = np.array(sequences)
X, y = sequences[:,:-1], sequences[:,-1] # fix this
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-87-eb7aab0c3a22> in <module>
18 #separate into input and output
19 sequences = np.array(sequences)
---> 20 X, y = sequences[:,:-1], sequences[:,-1] # fix this
21 y = to_categorical(y, num_classes=vocab_size)
22 seq_length = X.shape[1]
IndexError: too many indices for array
【问题讨论】:
总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。 @furas 我已经编辑了我的问题以包含完整的错误消息 它的教程是如何处理这个问题的? 【参考方案1】:问题是本教程在一页上的部分很少,每个部分都有自己的"Complete Example"
首先"Complete Example"
从republic_clean.txt
读取文本,将其清除并保存在republic_sequences.txt
- 它创建具有相同字数的序列。
第二个"Complete Example"
从republic_sequences.txt
读取文本并与
sequences = np.array(sequences)
X, y = sequences[:,:-1], sequences[:,-1]
因为第一部分创建了具有相同字数的序列,所以这段代码可以正常工作。
您似乎跳过了第一部分。您必须回到第一部分来学习如何清除文本以及如何创建可以在第二部分中使用的正确文件。
编辑:如果您不能使用相同数量的单词制作序列,那么您可以在较短的序列中添加空格。代码可以工作,但我不知道它是否会创建更好的模型。
sequences = [['a'], ['b','c'], ['d','e','f']]
max_len = max(map(len, sequences))
sequences = [x + [""]*(max_len-len(x)) for x in sequences]
print(sequences)
结果
[['a', '', ''], ['b', 'c', ''], ['d', 'e', 'f']]
【讨论】:
我的问题中没有我的整个文件。我认为我的麻烦来自我使用的数据,因为它与教程中的数据不同。在教程中,他从***创建序列,因为它是一本书,自然流动,他可以在另一端之后开始一个序列并保持它们的长度相同。我的数据是一百万个不同的新闻标题,它们不相关且长度不同,我不确定如何创建相同长度的序列,因为我认为他的方法对这个应用程序没有意义。 @furas 如果你有不同数量的句子,代码将无法工作。如果你不能削减标题然后找到最长的句子并使用它的大小将空格附加到其他序列 - 即。['a'] + ['']*2
- 代码可以工作,但我不确定空格是否会成为更好的模型。
我添加了如何在序列中添加空格以使所有长度相同的示例。
现在我检查了序列有数字,而不是单词。 Tokenizer 更改数字中的单词 - 但我不知道如果您添加数字 0
它是否会正常工作,因为它可以分配给单词。使用vocab_size+1
会更好。在 Tokenizer 之前,每一行都是一个带有单词的字符串,而不是单词列表 - 所以添加空格是行不通的,因为 Tokenizer 会删除它们。它必须是一些词。
它与空格有关-原始sequences
只有数字,没有单词,其余代码仅适用于数字。如果您向sequences
添加空格,那么它会尝试将空格转换为数字,int("")
会给出错误ValueError: invalid literal for int() with base 10: ''. I tried to add number
vocab_size` 而不是空格,但是您必须在y = to_categorical(y, num_classes=vocab_size+1)
行中输入vocab_size+1
。休息应该起作用。我有旧电脑,Keras 无法工作 - 可能需要与 CUDA
配合使用的显卡。以上是关于尝试对数组进行切片会导致“数组索引过多”。我可以填充阵列来解决这个问题吗?的主要内容,如果未能解决你的问题,请参考以下文章
尝试计算 numpy 数组列中的唯一项时出现“IndexError:数组索引过多”