我有一个 python 字典定义如下,其中最里面的项目是二元数组:
mydict = {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}}
我现在需要的是将所有第 0 个元素组成一个新数组,即使用 a[:,:,0] 或 a[...,0] 返回 [1,3,5,6] .但是,a[:,:,0] 或 a[...,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的数组。使用单独的括号访问相应的元素没有问题,例如,a[0][0][0] 返回 1。但是,a[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 数组?
请您参考如下方法:
您的问题来自以下事实: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() 取决于结果你想要的形状。
