Python 将字符串字典转换为numpy数组字典

Python 将字符串字典转换为numpy数组字典,python,arrays,numpy,for-loop,numpy-ndarray,Python,Arrays,Numpy,For Loop,Numpy Ndarray,我有一本结构与下面类似的词典 test_dict = {1: 'I run fast', 2: 'She runs', 3: 'How are you?'} 我要做的是将所有字符串转换成4x4 numpy数组,其中每个单词都在它自己的行中,每个字母占据数组的一个单元格,用空格填充不能填充整行的行,用空格填充长度小于4个单词的句子。我还需要能够将其绑定回ID,因此结果需要采用某种格式,以便以后可以通过其ID引用每个数组 我不知道有任何预构建的函数可以处理这样的事情,但我很高兴我错了。现在我一直在

我有一本结构与下面类似的词典

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)
这就是你的意思吗

{
    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')}

这将确保对于长度小于四个单词的句子有空行

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)

您可以使用此字段使用字段“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)]))

很抱歉,我忘了添加一件事,那就是我需要转换为ascii值。这很容易融入到您的解决方案中吗?我在将结果字典数组转换为ascii时遇到了一些问题。是的,这很容易。对于任何字符数组,array.viewnp.uint8提供了ascii等效值。我已经在代码中编辑了这行代码,看看它是否有效。现在似乎有比4x4阵列更多的方法了。看起来每个阵列现在都是4x16?我不确定分享我所看到的东西的最佳方式,所以我将把它作为编辑粘贴在原始问题中。哦,对不起。uint8将字符串分成4个块。np.int32应该可以工作,只是测试了一下。这太棒了,谢谢。出于好奇,我还有一个问题,我注意到在一个句子中,这个方法将任何空数组单元格转换为32 ascii的空格,但对于空行,它将其转换为0,这是有意义的。就我的目的而言,如果只有32个值是实际的空格,那么其余的值将是0,这将是理想的。所以第一个字符串数组的第一行看起来像[73,32,0,0],而不是[73,32,32,32]。如果这不是一个简单的编辑,我会自己做一些挖掘,再次感谢!这很接近,一件事是它似乎只创建3x4数组,正如我在上面提到的另一个解决方案,我很抱歉,但我忘了提到我正在尝试将字母转换为ascii。您可以创建结构化numpy数组,让您的ID访问您的数组,并使用ID调用它们
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)]