首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当将新值附加到数组时,防止嵌套列表输出从for循环/列表理解中输出

当将新值附加到数组时,防止嵌套列表输出从for循环/列表理解中输出
EN

Stack Overflow用户
提问于 2014-12-24 22:55:55
回答 2查看 1.1K关注 0票数 0

我试图循环列表理解,其中输出('my_array')在列表理解中被迭代:

代码语言:javascript
运行
复制
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个其他列表和一个数组中:

代码语言:javascript
运行
复制
[array([[[[ val1, val2, ...]]]])]

我有两个问题:

  1. 我是否可以完成上面的工作,而不会因此得到一个嵌套很深的列表?
  2. 我是否应该放弃对列表的理解,转而使用两个for循环(为了提高可读性)?

更新:--我在最初的文章中不够清楚地表达了我一直以来遇到的问题。对于实际情况来说,原始代码片段过于简单。在本例中,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)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-25 02:08:18

混淆:

您的问题陈述似乎不明确,因为:

  1. 你提到的list comprehension,但不使用它
  2. 对玩具问题中的变量使用混淆/专门化的名称,这些变量应该具有简单的、不冲突的虚拟名称。
  3. 缺少期望的输出,给出变量的一些虚拟值
  4. 将值添加或连接到现有数组的目标不明确

首先,让我们把你的问题弄清楚:

你有:

  1. 名为numpymy_list数组
  2. 一种叫listharmonic
  3. 一个名为var1的变量

你要么想:

  1. my_list元素中添加var1 对每个值进行缩放后的前4个值的和
  2. 将被my_list缩放后的harmonic的前4个值附加到var1

假设harmonicvar1的虚拟值

代码语言:javascript
运行
复制
harmonic = np.arange(4)
var1 = 2

解决方案:

关于第一个目标:

您不需要使用list comprehension或嵌套for loop

  1. 您可以将按元素划分的var1harmonic相乘,然后使用np.sum()添加其所有元素。
  2. 然后,可以按元素顺序将步骤1的结果添加到my_list中。

记住:标量操作总是element-wisenumpy

代码语言:javascript
运行
复制
>>> 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.        ])

关于第二个目标:

  1. 您也可以使用harmonic或使用list comprehensionharmonic的前4个值进行循环,并形成一个新的修改值列表。
  2. 然后使用np.append()将新形成的列表连接到my_list

代码语言:javascript
运行
复制
>>> 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.        ])

您的错误方法:

您的代码试图通过在每次迭代中生成一个新的list数组来使用list comprehension来形成一个harmonic数组,方法是将harmonic元素的修改元素按顺序添加到旧的my_list中,并在每次迭代时将这个新形成的numpy数组连接到list中。

因此,您的方法相当于以下内容:

代码语言:javascript
运行
复制
>>> my_list = [my_list + harmonic[i] * var1 for i in range(4)]

您可以从中获得(nested) list of numpy数组:

代码语言:javascript
运行
复制
[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.        ])]
票数 2
EN

Stack Overflow用户

发布于 2014-12-24 23:00:06

注意,在这段代码中,您实际上并没有使用列表理解。你可以,如果你愿意的话。试一试:

代码语言:javascript
运行
复制
my_list = range(10) + [cycle[coeff] * var1 for coeff in range(4)]
# in python3, you'll have to do ... = list(range(10)) + ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27642861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档