我正在尝试遍历列表理解,其中输出(' 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)
答案 0 :(得分:2)
<强>混乱:强>
您的问题陈述似乎不清楚,因为:
list comprehension
但未使用首先,让我们直接解决问题:
你有:
numpy
my_list
数组
list
名为harmonic
var1
你想要:
my_list
添加harmonic
每个var1
后的my_list
的总和,harmonic
或 var1
harmonic
后,将var1
的前4个值附加到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. ])
请记住:var1
harmonic
list comprehension
第二个目标:
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个值并形成新的修改值列表。 list
将新组建的列表连接到list comprehension
。即
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)) + ...