如何从loadmat函数生成的嵌套numpy数组中有效地提取值?

时间:2018-01-12 20:07:44

标签: python numpy scipy nested-lists

python中是否有更有效的方法从嵌套的python列表中提取数据,例如A = array([[array([[12000000]])]], dtype=object)。我一直在使用A[0][0][0][0],当你有很多像A这样的数据时,它似乎不是一种效率方法。

我也用过 numpy.squeeeze(array([[array([[12000000]])]], dtype=object))但是这给了我

array(array([[12000000]]), dtype=object)

PS:嵌套数组是由scipy模块中的loadmat()函数生成的,用于加载由嵌套结构组成的.mat文件。

4 个答案:

答案 0 :(得分:3)

您可以使用A.all()或A.any()来获取标量。这仅在A包含一个元素时才有效。

答案 1 :(得分:2)

创建这样的数组有点单调乏味,但loadmat可以处理MATLAB单元格和2d矩阵:

In [5]: A = np.empty((1,1),object)
In [6]: A[0,0] = np.array([[1.23]])
In [7]: A
Out[7]: array([[array([[ 1.23]])]], dtype=object)
In [8]: A.any()
Out[8]: array([[ 1.23]])
In [9]: A.shape
Out[9]: (1, 1)

squeeze压缩形状,但不会越过object边界

In [10]: np.squeeze(A)
Out[10]: array(array([[ 1.23]]), dtype=object)

但是如果数组中有一个项目(无论形状如何)item()都可以提取它。索引也有效,A[0,0]

In [11]: np.squeeze(A).item()
Out[11]: array([[ 1.23]])
再次

item从内部数组中提取数字:

In [12]: np.squeeze(A).item().item()
Out[12]: 1.23

或者我们甚至不需要squeeze

In [13]: A.item().item()
Out[13]: 1.23

loadmat有一个squeeze_me参数。

索引也很简单:

In [17]: A[0,0]
Out[17]: array([[ 1.23]])
In [18]: A[0,0][0,0]
Out[18]: 1.23

astype也可以起作用(尽管它可能对维度的数量很挑剔)。

In [21]: A.astype(float)
Out[21]: array([[ 1.23]])

单项数组如效率并不是一个大问题。所有这些方法都很快。当数组有很多项目,或者项目本身很大时,事情变得更加复杂。

How to access elements of numpy ndarray?

答案 2 :(得分:1)

尝试A.flatten()[0]

这会将数组展平为一个维度,并从中提取第一项。就您而言,第一项是唯一项。

答案 3 :(得分:0)

以下是我的情况。

import scipy.io

xcat = scipy.io.loadmat(os.path.join(dir_data, file_name))
pars = xcat['pars']  # Extract numpy.void element from the loadmat object

# Note that you are dealing with a numpy structured array object when you enter pars[0][0]. 
# Thus you can acces names and all that...
dict_values = [x[0][0] for x in pars[0][0]]  # Extract all elements in one go
dict_keys = list(pars.dtype.names)  # Extract the corresponding names/tags
dict_xcat = dict(zip(dict_keys, dict_values))  # Pack it up again in a dict

这背后的想法是..首先提取我想要的所有值,并将其格式化为漂亮的python dict。 这样可以避免以后在文件中建立繁琐的索引...

当然,这是一个非常具体的解决方案。由于在我的情况下,我需要的值都是浮点数/整数。