我正在尝试将数组数组转换为列表。听起来很奇怪? 数组A看起来像这样:
array([array(['Afr_004'],
dtype='<U7'),
array(['Afr_005'],
dtype='<U7'),
array(['Afr_012'],
dtype='<U7'), ...,
array(['SAm_029'],
dtype='<U7'),
array(['SAm_030'],
dtype='<U7'),
array(['SAm_031'],
dtype='<U7')], dtype=object)
是通过scipy.io.load()
从.mat文件加载数据获得的。我不知道为什么它选择这样一个丑陋的,不方便的结构应该是一个字符串列表。我试图以各种方式将A转换为这样的列表:
1)L = np.concatenate(A).ravel()
或2)L = [x[0] for x in A]
两者都很好用,但按字母顺序排列基础元素:
['Afr_004', 'Afr_005', 'Afr_012', 'Ant_001', 'Ant_002']
你可以看到L(上面)的前3个元素与A相同,但接下来的3个不是。现在,事实证明排序是我最终想要对此列表做什么,但是在捕获排序列表的索引之前(我需要这些索引来重新排序基于列表的另一个数组) L)。
所以,2个问题:
提前感谢我对Python数据结构缺乏了解。
答案 0 :(得分:1)
在Octave会话中,我制作了c
并保存了
c = {'Afr_004','Afr_005','Afr_012','SAm_031','SAm_029','Ant_001','Ant_002','SAm_030'}
在Ipython中
In [55]: arr=data['c']
In [56]: arr
Out[56]:
array([[array(['Afr_004'],
dtype='<U7'),
array(['Afr_005'],
dtype='<U7'),
array(['Afr_012'],
dtype='<U7'),
array(['SAm_031'],
dtype='<U7'),
array(['SAm_029'],
dtype='<U7'),
array(['Ant_001'],
dtype='<U7'),
array(['Ant_002'],
dtype='<U7'),
array(['SAm_030'],
dtype='<U7')]], dtype=object)
看起来很像你的,除了它是2d; arr[0]
负责额外维度。它是一个对象数组,因为MATLAB单元格可以包含“任何东西”,比如Python列表。创建时顺序相同。
In [59]: L = np.concatenate(arr[0]).ravel()
In [60]: L
Out[60]:
array(['Afr_004', 'Afr_005', 'Afr_012', 'SAm_031', 'SAm_029', 'Ant_001', 'Ant_002', 'SAm_030'],
dtype='<U7')
In [61]: L1 = [x[0] for x in arr[0]]
In [62]: L1
Out[62]:
['Afr_004',
'Afr_005',
'Afr_012',
'SAm_031',
'SAm_029',
'Ant_001',
'Ant_002',
'SAm_030']
与您的两种方法相同。
答案 1 :(得分:0)
我最终使用了一个老式的循环来构建我想要的列表
N = len(A)
L = ["?" for x in range(N)] # initialize list
for r in range(N):
L[r] = A[0][r][0]
列表已排序,即使A不是,至少在Spyder变量资源管理器或IPython提示符中查看数组。我怀疑问题在于这个数组的形状。我最终追求另一条路线,涉及导出到Excel的相同字符串列表和openpyxl包。没问题。