【问题标题】:Convert a dictionary of strings to a dictionary of numpy arrays将字符串字典转换为 numpy 数组字典
【发布时间】:2020-09-16 07:18:11
【问题描述】:

我有一个结构类似于下面的字典。

test_dict = {1: 'I run fast', 2: 'She runs', 3: 'How are you?'}

我要做的是将所有字符串转换为 4x4 numpy 数组,其中每个单词都在它自己的行中,并且每个字母占据数组的一个单元格,对于不会填充整行的行填充空格少于 4 个单词的句子的一整行空格。我还需要能够将其绑定回 ID,因此结果需要采用某种格式,以便以后通过其 ID 引用每个数组。

我不知道任何可以处理此类事情的预构建函数,但我很乐意出错。现在我一直在尝试编写一个循环来处理它。下面显然是不完整的,因为我被困在我想要的结构中创建数组的点上。

for k in test_dict.keys():
    sentence = test_dict.getvalues(k)
    sentence_ascii = [ord(c) for c in sentence]
    sentence_array = np.array(sentence_ascii)

【问题讨论】:

  • 您可以创建结构化的 numpy 数组,让您的 ID 访问您的数组并使用 ID 调用它们

标签: python arrays numpy for-loop numpy-ndarray


【解决方案1】:

这是你的意思吗?

{
    key: np.array([list(word.ljust(4)) for word in val.split()])
    for key, val in test_dict.items()
}

输出:

{1: array([['I', ' ', ' ', ' '],
           ['r', 'u', 'n', ' '],
           ['f', 'a', 's', 't']], dtype='<U1'),
 2: array([['S', 'h', 'e', ' '],
           ['r', 'u', 'n', 's']], dtype='<U1'),
 3: array([['H', 'o', 'w', ' '],
           ['a', 'r', 'e', ' '],
           ['y', 'o', 'u', '?']], dtype='<U1')}

【讨论】:

  • 这很接近,一件事是它似乎只创建 3x4 数组,正如我在上面的另一个解决方案中提到的那样,我很抱歉,但我也忘了提到我正在尝试将字母转换为 ascii .
【解决方案2】:

这将确保少于四个单词的句子有空白行。

new_dict = {i+1:np.empty((4,4),dtype='str') for i in range(len(test_dict))}
for k,v in test_dict.items():
    new_dict[k][:len(v.split())] = np.array([list(s)+['']*(4-len(s)) for s in v.split()])
    new_dict[k] = new_dict[k].view(np.int32)

【讨论】:

  • 抱歉,我忘记添加的一件事是我需要转换为 ascii 值。这很容易融入您的解决方案吗?我在将结果字典数组转换为 ascii 时遇到了一些麻烦。
  • 是的,这很容易。对于任何字符数组,array.view(np.uint8) 给出 ascii 等效项。我已经在代码中编辑了该行,看看它是否有效。
  • 现在似乎不仅仅是一个 4x4 数组。看起来每个数组现在都是 4x16?我不确定分享我所看到内容的最佳方式,因此我会将其粘贴在原始问题中作为编辑。
  • 抱歉。 uint8 将字符串分成 4 个块。 np.int32 应该可以工作,刚刚测试过。
  • 这太棒了,谢谢。出于好奇,我还有一个问题,我注意到在一句话中,此方法将任何空数组单元格转换为 32(ascii 表示空格),但对于空行,它将其转换为 0(这是有道理的)。就我的目的而言,如果只有 32 个值是实际空格,其余的都是 0,那将是理想的。所以第一个字符串数组的第一行看起来像 [73,32,0,0] 而不是 [73,32 ,32,32]。如果这不是一个简单的编辑,我会自己做一些挖掘,再次感谢!
【解决方案3】:

您可以使用它来使用字段“ID”调用您的数组:

dt=[('ID', '<i4'), ('sentences', object)]
new_dict = np.empty(len(test_dict), dtype=dt)
for i, (k, v) in enumerate(test_dict.items()):
  new_dict[i] = (k, np.pad(np.array([list("{:<4}".format(w)) for w in v.split(' ')]).view(np.int32), [(0,4-len(v.split(' '))),(0,0)]))

示例输出:

print(new_dict[new_dict['ID']==2]['sentences'])

[array([[ 83, 104, 101,  32],
   [114, 117, 110, 115],
   [  0,   0,   0,   0],
   [  0,   0,   0,   0]], dtype=int32)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2019-05-29
    • 2012-09-07
    • 2010-12-10
    相关资源
    最近更新 更多