将字典的内容导出到m x n矩阵

时间:2018-08-14 17:15:14

标签: python python-2.7 numpy dictionary matrix

我有一本字典,可以更改对象数。每个对象的类型将始终为3元素的ND数组。例如:

exampleDict = {u'A': array([ 1, 2, 3]), u'B': array([ 2, 3, 4]), u'C': array([ 3, 4, 5]), u'D': array([ 4, 5, 6])}

使用for循环,我希望能够创建一个如下所示的矩阵:

exampleMatrix = array([[ 1, 2, 3], [ 2, 3, 4], [ 3, 4, 5], [ 4, 5, 6]])

我能够使用以下方法创建尺寸正确的0矩阵:

exampleMatrix = np.zeros((len(exampleDict), 3))

但是,我不知道如何适当地填充该矩阵。我正在尝试使用for循环。我愿意接受其他建议。谢谢!

2 个答案:

答案 0 :(得分:2)

这里最棘手的部分是,不能保证在某些版本的Python中无法对字典进行排序(如果您使用的是Python 2.7,则肯定不会对字典进行排序),因此必须有一种方法来确定其值的顺序最终的数组。

由于您似乎想按字母的字母顺序创建数组,因此可以使用列表推导和sorted

np.array([v for _, v in sorted(exampleDict.items())])

array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])

答案 1 :(得分:0)

如果您想保留键以供将来参考(与其他变量相比),并且仍将其视为numpy数组,则可以使用Pandas的数据框:

CREATE OR REPLACE PROCEDURE display_users ( pi_date1 IN DATE, pi_date2 IN DATE, po_userdisp_cur OUT SYS_REFCURSOR ) IS BEGIN OPEN po_userdisp_cur FOR SELECT u.enrollno, u.error_code, u.enroll_date FROM user_table u WHERE u.enroll_date BETWEEN pi_date1 AND pi_date2; END;

然后,您可以对其执行numpy操作,有时您可能必须使用my_array=pandas.DataFrame(exampleDict)。 由于您具有密钥,因此熊猫在其余的代码中可能会做很多工作,从而省去了一些麻烦。我建议去看看。

如果您想保持简单,则除了列表理解其他答案外,还有一种更简单的方法。尽管我不确定您是否会面对大型阵列产生任何影响,但是使用解决方案进行速度测试的方法是:

my_array.values:3.63u

np.array([v for _, v in (exampleDict.items())]):3.53u

np.array([v for v in exampleDict.values()]):3.40u

不用说,熊猫解决方案将比其他方法花费更多的时间,它仅保留更多信息,并且“也许”将速度提高到其他地方。