将新值附加到Array时,防止来自for循环/列表解析的嵌套列表输出

时间:2014-12-24 22:55:55

标签: python numpy append list-comprehension nested-lists

我正在尝试遍历列表理解,其中输出(' my_array')在列表解析中被迭代:

my_array = np.linspace(1, 8, 10)
harmonic = np.random.rand(10,4)
var1 = (11, 12, 13, 14)
for coeff in range(4):
    my_array = [my_array + harmonic[coeff] * var1]

虽然这似乎有效,但my_list最终嵌套在4个其他列表和一个数组中:

[array([[[[ val1, val2, ...]]]])]

我有两个问题:

  1. 我可以在不获得深层嵌套列表的情况下完成上述操作吗?
  2. 我是否应该放弃列表理解并使用两个for循环(为了提高可读性)?
  3. 更新:我在原帖中不够清楚,无法传达我曾经遇到过的问题。原始代码段对于实际情况来说太简单了。在此示例中,harmonic是一个10x4数组,var1是一个已从字典中删除的4元素元组,而my_array(以前为my_list)是一个10元素数组。我想将harmonic中的第一列与var1中的第一列相乘,harmonic的第二列与var1的第二列相乘,依此类推。然后我想将这4列和my_array加在一起。

    我使用Pacific Stickler的解决方案1进行了一些小变化,以解释更复杂的变量:
    product = harmonic * var1
    new_array = my_array + np.sum(product, axis=1)

2 个答案:

答案 0 :(得分:2)

<强>混乱:

您的问题陈述似乎不清楚,因为:

  1. 您提到list comprehension但未使用
  2. 您对玩具问题中变量的混淆/专用名称的使用应该具有简单的非冲突虚拟名称
  3. 在给定变量的虚拟值的情况下缺少所需的输出
  4. 不清楚将值添加或连接到现有数组的目标
  5. 首先,让我们直接解决问题:

    你有:

    1. 名为numpy
    2. my_list数组
    3. list名为harmonic
    4. 一个名为var1
    5. 的变量

      你想要:

      1. 逐个my_list添加harmonic每个var1后的my_list的总和,harmonic
      2. var1
      3. 缩放harmonic后,将var1的前4个值附加到harmonic = np.arange(4) var1 = 2

        假设list comprehensionfor loop的虚拟值:

        var1

        <强>解决方案:

        第一个目标:

        您无需使用harmonic或嵌套np.sum()

        1. 您可以将符号元素1my_list相乘,然后使用element-wise添加所有元素
        2. 然后,您可以将步骤numpy的结果按行添加到>>> my_list + np.sum( harmonic * var1 ) array([ 13. , 13.77777778, 14.55555556, 15.33333333, 16.11111111, 16.88888889, 17.66666667, 18.44444444, 19.22222222, 20. ])
        3. 请记住:var1

          中的标量操作始终为harmonic
          list comprehension

          第二个目标:

          1. 您可以再次使用harmonic 使用np.append()逐个元素my_list来循环>>> np.append( my_list, var1 * harmonic ) # equivalent to: np.append( my_list, [harmonic[i] * var1 for i in range(4)]) array([ 1. , 1.77777778, 2.55555556, 3.33333333, 4.11111111, 4.88888889, 5.66666667, 6.44444444, 7.22222222, 8. , 0. , 2. , 4. , 6. ]) 的前4个值并形成新的修改值列表。
          2. 然后使用list将新组建的列表连接到list comprehension
          3. numpy

            您的不正确方法:

            您的代码尝试通过在每次迭代中形成一个新的harmonic数组,通过向您的旧元素添加my_list元素的修改元素,使用numpy来形成list >>> my_list = [my_list + harmonic[i] * var1 for i in range(4)] 并在每次迭代时将这个新形成的nested数组连接到您的list

            所以你的方法等同于以下内容:

            numpy

            哪个offcourse为您提供[array([ 1. , 1.77777778, 2.55555556, 3.33333333, 4.11111111, 4.88888889, 5.66666667, 6.44444444, 7.22222222, 8. ]), array([ 3. , 3.77777778, 4.55555556, 5.33333333, 6.11111111, 6.88888889, 7.66666667, 8.44444444, 9.22222222, 10. ]), array([ 5. , 5.77777778, 6.55555556, 7.33333333, 8.11111111, 8.88888889, 9.66666667, 10.44444444, 11.22222222, 12. ]), array([ 7. , 7.77777778, 8.55555556, 9.33333333, 10.11111111, 10.88888889, 11.66666667, 12.44444444, 13.22222222, 14. ])] {{1}}个{{1}}数组:

            {{1}}

答案 1 :(得分:0)

请注意,您实际上并未在此代码中使用列表推导。如果你愿意,你可以。试试这个:

my_list = range(10) + [cycle[coeff] * var1 for coeff in range(4)]
# in python3, you'll have to do ... = list(range(10)) + ...