Python 从dict创建数组

Python 从dict创建数组,python,numpy,list-comprehension,Python,Numpy,List Comprehension,我在字典里有一些单词,根据这些单词和一些句子,我想创建一个特定的数组 words = {'a': array([ 1.78505888, -0.40040435, -0.2555062 ]), 'c': array([ 0.58101204, -0.23254054, -0.5700197 ]), 'b': array([ 1.17213122, 0.38232652, -0.78477569]), 'd': array([-0.07545012, -0.10094538, -0.981361

我在字典里有一些单词,根据这些单词和一些句子,我想创建一个特定的数组

words = {'a': array([ 1.78505888, -0.40040435, -0.2555062 ]), 'c': array([ 0.58101204, -0.23254054, -0.5700197 ]), 'b': array([ 1.17213122,  0.38232652, -0.78477569]), 'd': array([-0.07545012, -0.10094538, -0.98136142])}

sentences = [['a', 'c'], ['b', 'a', 'd'], ['d', 'c']]
我想要的是得到一个数组,第一行是垂直堆叠的“a”和“c”的值。
第二行是垂直堆叠的“b”和“a”值。
第三,“d”和“c”的值垂直叠加

我试过这个:

np.vstack((words[word] for word in sentences[0]))
>>> array([[ 1.78505888, -0.40040435, -0.2555062 ],
   [ 0.58101204, -0.23254054, -0.5700197 ]])
所以这是我的第一行,但是我不能用列表理解的方法来理解“句子”(只有一行)

编辑: 基本上我想做的是

first_row = np.vstack((words[word] for word in sentences[0]))
second_row = np.vstack((words[word] for word in sentences[1]))
third_row = np.vstack((words[word] for word in sentences[2]))

l = []
l.append(first_row)
l.append(second_row)
l.append(third_row)

print np.array(l)
>>> [[[ 1.78505888 -0.40040435 -0.2555062 ]
      [ 0.58101204 -0.23254054 -0.5700197 ]]

     [[ 1.17213122  0.38232652 -0.78477569]
      [ 1.78505888 -0.40040435 -0.2555062 ]
      [-0.07545012, -0.10094538, -0.98136142]]

     [[-0.07545012 -0.10094538 -0.98136142]
      [ 0.58101204 -0.23254054 -0.5700197 ]]]
您可以使用建立
单词的字符串键
句子的每个元素中的字符串之间的对应关系。对
句子中的所有元素重复此过程,以获得最终结果。因此,我们只有一个层次的循环来解决它。实现如下所示-

K = words.keys()
sortidx = np.argsort(K)
V = np.vstack(words.values())[sortidx]
out = [V[np.searchsorted(K,S,sorter=sortidx)] for S in sentences]
样本运行-

In [122]: words
Out[122]: 
{'a': array([ 1.78505888, -0.40040435, -0.2555062 ]),
 'b': array([ 1.17213122,  0.38232652, -0.78477569]),
 'c': array([ 0.58101204, -0.23254054, -0.5700197 ]),
 'd': array([-0.07545012, -0.10094538, -0.98136142])}

In [123]: sentences
Out[123]: [['a', 'c'], ['b', 'a', 'd'], ['d', 'c']]

In [124]: K = words.keys()
     ...: sortidx = np.argsort(K)
     ...: V = np.vstack(words.values())[sortidx]
     ...: out = [V[np.searchsorted(K,S,sorter=sortidx)] for S in sentences]
     ...: 

In [125]: out
Out[125]: 
[array([[ 1.78505888, -0.40040435, -0.2555062 ],
        [ 0.58101204, -0.23254054, -0.5700197 ]]),
 array([[ 1.17213122,  0.38232652, -0.78477569],
        [ 1.78505888, -0.40040435, -0.2555062 ],
        [-0.07545012, -0.10094538, -0.98136142]]),
 array([[-0.07545012, -0.10094538, -0.98136142],
        [ 0.58101204, -0.23254054, -0.5700197 ]])]

您可以发布一个示例输出吗?您是否总是在
单词
中的每个键都有相同数量的元素,就像在这里的
3中一样?在
句子中,每个索引的元素数是否总是相同的,就像它们在样本数据中成对出现一样?在“单词”字典中,所有值都具有相同的维度(大小为n的numpy数组),但在“句子”行中可以具有不同的长度。我认为,由于“不同的长度”标准,您可能在
第一行
第二行
中有不同的行数,等等。。我认为您无法将所有这些“行”存储在常规数据列中。在最终输出的“行”列表中包含所有行,您可以吗。因此,它将是一个2D数组的列表,其中2D数组具有不同的行数。我认为最好有一个示例
句子
,其中一个元素的长度不同,如
3
。因此,作为一个例子,第一个可以是
['a',c',b']
而不是
['a',c']
。我的字典会很大,所以我认为复制它不是一个好主意。@dooms复制的到底是什么?你能澄清一下吗?这里的“V”和“K”是由“words”创建的,所以基本上你把我的字典拆分成键和值。所以在内存中会有两倍于单词的大小。@dooms好吧,我不确定这里的内存需求,但从逻辑上讲,我认为既然
words
同时存储键和值。因此,在提取之后,
V
K
的组合内存需求将类似于
单词
。我建议在打电话之前先测试一下。这不是真正的提取,它们仍然存在。在调用keys()之后,如果您尝试使用words['a'],它应该会起作用。