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文件。
答案 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]])
单项数组如效率并不是一个大问题。所有这些方法都很快。当数组有很多项目,或者项目本身很大时,事情变得更加复杂。
答案 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。 这样可以避免以后在文件中建立繁琐的索引...
当然,这是一个非常具体的解决方案。由于在我的情况下,我需要的值都是浮点数/整数。