我试图循环列表理解,其中输出('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, ...]]]])]
我有两个问题:
更新:--我在最初的文章中不够清楚地表达了我一直以来遇到的问题。对于实际情况来说,原始代码片段过于简单。在本例中,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)
发布于 2014-12-25 02:08:18
混淆:
您的问题陈述似乎不明确,因为:
list comprehension
,但不使用它首先,让我们把你的问题弄清楚:
你有:
numpy
的my_list
数组list
的harmonic
var1
的变量你要么想:
my_list
元素中添加var1
或对每个值进行缩放后的前4个值的和my_list
缩放后的harmonic
的前4个值附加到var1
中假设harmonic
和var1
的虚拟值
harmonic = np.arange(4)
var1 = 2
解决方案:
关于第一个目标:
您不需要使用list comprehension
或嵌套for loop
var1
与harmonic
相乘,然后使用np.sum()
添加其所有元素。1
的结果添加到my_list
中。记住:标量操作总是element-wise
在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. ])
关于第二个目标:
harmonic
或使用list comprehension
对harmonic
的前4个值进行循环,并形成一个新的修改值列表。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. ])
您的错误方法:
您的代码试图通过在每次迭代中生成一个新的list
数组来使用list comprehension
来形成一个harmonic
数组,方法是将harmonic
元素的修改元素按顺序添加到旧的my_list
中,并在每次迭代时将这个新形成的numpy
数组连接到list
中。
因此,您的方法相当于以下内容:
>>> my_list = [my_list + harmonic[i] * var1 for i in range(4)]
您可以从中获得(nested
) list
of numpy
数组:
[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. ])]
发布于 2014-12-24 23:00:06
注意,在这段代码中,您实际上并没有使用列表理解。你可以,如果你愿意的话。试一试:
my_list = range(10) + [cycle[coeff] * var1 for coeff in range(4)]
# in python3, you'll have to do ... = list(range(10)) + ...
https://stackoverflow.com/questions/27642861
复制相似问题