通过迭代列表在python中生成三维数组

时间:2012-11-09 18:18:36

标签: python arrays multidimensional-array numpy

我很欣赏,鉴于我的知识水平(或缺乏),这项任务可能有点雄心勃勃,但仍然存在。

我有一个包含16个字符串的列表,大约有3000个项目,其中每个字符表示另一个数字列表。不确定我是否说得那么清楚;实际上它是16个氨基酸长肽的列表,其中每个氨基酸(20个中的1个)可由5个数字表示。

我想遍历该列表(肽段),然后为每个字符(氨基酸)添加相关的5个数字(Atchley因子,如果您感兴趣)到数组,制作3维数组,其中我的轴是:肽的实例(3000)x肽内的氨基酸(16)x因子(5)。

我出乎意料地超出了我的深度,所以我不确定我所获得的是否有用是有帮助的,但这里是(使用numpy):

array = np.empty(shape=(len(peptides),16,5)

for i in peptides:

    for j in str(i):

(此时我尝试了一堆不同的东西,因为我在论坛上搜索,结尾的东西有点像这样,但我确信我甚至错过了我的目标)

    if j == 'A':    
            L16Afctrs = np.append([-0.59145974, -1.30209266, -0.7330651, 1.5703918, -0.14550842], axis=1)
    elif j == 'C':
            L16Afctrs = np.append([-1.34267179, 0.46542300, -0.8620345, -1.0200786, -0.25516894], axis=1)
    ...
    elif j == 'Y':
            L16Afctrs = np.append([0.25999617, 0.82992312, 3.0973596, -0.8380164, 1.51150958], axis=1)

就像我说的那样,我老老实实地在挣扎,任何帮助都会非常感激。

编辑:澄清(希望如此)

我有一个大约3000个不同的16个字符串的列表,其中这些字符串中的每个字符表示另外5个数字。

我想生成一个三维数组或结构,通过查看三维数组中的给定平面(我设想的维度),我可以(最终)绘制所有3000个字符串中给定位置的5个数字。是;原始字符串x 16个字符x 5个因子)。

我目前正在编写不同字符的字典,与@Winston的帖子有关,然后尝试将其折叠成3d数组。

编辑2:成功!

温斯顿的修复效果非常好!

1 个答案:

答案 0 :(得分:2)

将数据存储在字典中:

DATA = {
    'A' : numpy.array([-0.59145974, -1.30209266, -0.7330651, 1.5703918, -0.14550842]),
    'B' : numpy.array([-1.34267179, 0.46542300, -0.8620345, -1.0200786, -0.25516894]),
    'D' : numpy.array([1.05015062, 0.30242411, -3.6559147, -0.2590236, -3.24176791])
    ...
}

使用python list comprehension构建所有这些列表,然后将该列表numpy转换为numpy数组

counters = numpy.array([DATA[letter] for peptide in peptides for letter in peptide])

将阵列重塑为3D维度,因为最后一步将具有2D阵列

counters = counters.reshape( len(peptides), 16, 5 )