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'],它应该会起作用。