我有一个python字典定义如下,其中最里面的项是双元素数组:
mydict = {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}}
我现在需要的是将所有第0个元素组成一个新数组,即使用[:,:0]或[...,0]返回[1,3,5,6] 。但是,[:,:0]或[...,0]在这种情况下不起作用,如下所示。
import numpy as np
import pandas as pd
a = np.array(pd.DataFrame.from_dict(mydict))
print a
给出以下输出:
[[[1, 2] [5, 6]]
[[3, 4] [7, 8]]]
这似乎是一个2x2x2阵列。使用单独的括号访问相应的元素没有问题,例如,[0] [0] [0]返回1.但是,[0,0,0]会导致错误。
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-150-f68aba7de42a> in <module>()
----> 1 a[0,0,0]
IndexError: too many indices for array
似乎两元素数组被认为是2x2数组中的元素 - 但我需要的是一个2x2x2数组才能实现我的目标。有没有办法将其转换为2x2x2阵列?
答案 0 :(得分:5)
您的问题来自于pandas将您的初始条目(列表)视为对象这一事实,因此当您转换为numpy数组时,您最内部的条目是列表对象。例如,
> type(a)
numpy.ndarray
> type(a[0])
numpy.ndarray
> type(a[0,0])
list
如果您知道最终想要的形状(2x2x2),您可以随时执行:
> b = np.array(map(np.array, a.flat)).reshape(2,2,2)
> b.shape
(2, 2, 2)
> b[0,0,0]
1
编辑:甚至更简单:
> b = np.array(a.tolist())
array([[[1, 2],
[5, 6]],
[[3, 4],
[7, 8]]])
如果您想要每个最里面一行的第一项,例如1,3,5,7,您可以b[...,0]
或b[...,0].flatten()
,具体取决于您想要的结果。
答案 1 :(得分:2)
没有Pandas我可以用:
重新创建你的数组In [1723]: mydict = {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}}
In [1724]: mydict
Out[1724]: {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}}
In [1725]: mydict[1]
Out[1725]: {1: [1, 2], 2: [3, 4]}
In [1726]: mydict[2]
Out[1726]: {1: [5, 6], 2: [7, 8]}
In [1727]: a=np.empty((2,2),dtype=object)
In [1728]: for i in range(2):
...: for j in range(2):
...: a[i,j]=mydict[i+1][j+1]
...:
In [1729]: a
Out[1729]:
array([[[1, 2], [3, 4]],
[[5, 6], [7, 8]]], dtype=object)
In [1730]: print(a)
[[[1, 2] [3, 4]]
[[5, 6] [7, 8]]]
最后一张与你的相同。
此数组的元素是列表
In [1735]: a[0,1]
Out[1735]: [3, 4]
In [1736]: type(a[0,1])
Out[1736]: list
将此转换为3d数组的简单方法是使用tolist
:
In [1737]: a.tolist()
Out[1737]: [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
In [1738]: np.array(a.tolist())
Out[1738]:
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
In [1739]: _.shape
Out[1739]: (2, 2, 2)
# dtype('int32')
tolist
将数组解压缩到嵌套列表中;然后np.array
从列表结构中创建最高维数组。
答案 2 :(得分:1)
你需要挖掘每个字典元素,然后进入每个子字典,并拉出每个叶子列表的第一个元素。
a = [mydict[x][y][0] for y in mydict[x] for x in mydict]
作为Python列表的结果:
[1, 3, 5, 7]
我相信这就是你真正想要的。