创建保留订单的列表

时间:2017-03-21 20:35:39

标签: python python-3.x numpy

我正在尝试将数组数组转换为列表。听起来很奇怪? 数组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个问题:

  1. 有没有办法从A?
  2. 获得未分类的L
  3. 我是否甚至需要这样,或者是否有更多的Pythonic方法来基于L索引我的数组(而不是A之后的默认顺序)?
  4. 提前感谢我对Python数据结构缺乏了解。

2 个答案:

答案 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包。没问题。