【问题标题】:Python iterative subtraction of a list [closed]列表的Python迭代减法[关闭]
【发布时间】:2017-09-29 10:32:36
【问题描述】:

我有一个包含 n 个值的数组,我想将 n 个不同的值减去 m 次(每次从上一个结果中减去)。

我想保存整个矩阵。

我尝试了两个嵌套的 for 循环,但我没能做到,而且我找不到任何严格相关的帖子...

数据 = https://www.dropbox.com/s/anhyqq9f7h75qee/trace1.dat?dl=0

values_to_subtract = (data - k)/m

k = 常数值

示例:

x = np.array([x1,x2,x3])

m = 3

dx = (x-k)/m

我想将 x 的每个元素减少其自己的计算量 dx 并且我想执行 3 次以获得这个矩阵:

Target Result

非常感谢

【问题讨论】:

  • 发布实际数组和预期的最终结果
  • 编辑问题以显示一个小的工作示例。

标签: python list loops for-loop iteration


【解决方案1】:

使用broadcasting 非常简单。

例如:

>>> import numpy as np
>>> dx = np.array([[1], [2], [3]])
>>> dx
array([[1],
       [2],
       [3]])
>>> dx * np.arange(4)
array([[0, 1, 2, 3],
       [0, 2, 4, 6],
       [0, 3, 6, 9]])
>>> x = np.array([[10], [10], [10]])
>>> x - dx * np.arange(4)
array([[10,  9,  8,  7],
       [10,  8,  6,  4],
       [10,  7,  4,  1]])

通常,如果您的数组具有兼容的形状,广播的作用是以一种很好的方式沿所有轴应用操作。所以在这一步:

>>> dx * np.arange(4)
array([[0, 1, 2, 3],
       [0, 2, 4, 6],
       [0, 3, 6, 9]])

numpy 正在使用outer product,即:

[1]                  [0  1*1  2*1  3*1]
[2]  *  [0 1 2 3]  = [0  1*2  2*2  3*2]
[3]                  [0  1*3  2*3  3*3]

这给出了你想从x 中减去的所有值。广播x - dx * np.arange(4) 采用列向量x 并将其广播成与外积相同的形状(复制每一列的值),这样最终的操作看起来像

[10  10  10  10]     [0  1*1  2*1  3*1]
[10  10  10  10]  -  [0  1*2  2*2  3*2]
[10  10  10  10]     [0  1*3  2*3  3*3]

等于,就像你的 LaTeX 方程一样:

[x1  x1-dx  x1-2dx  x1-3dx]
[x2  x2-dx  x2-2dx  x2-3dx]
[x3  x3-dx  x3-2dx  x3-3dx]

【讨论】:

  • 非常感谢 Alexander... 但由于某种原因,我的代码(与您的代码相同)它不起作用,因为它说操作数不能与不同的形状一起广播。我猜这是不起作用的外部产品。考虑到我的数据(我的'x')是使用 np.loadtxt 加载为 txt 文件...
  • 你的可能和我的不一样。请注意,我的 x 是形状 (3,1)。你的是什么?
  • 如果我用 np.shape 检查它会显示 (10136,)
  • 哎呀,对不起——像你这样的x 形状很好(我这里是 (3,)),但你的 dx 形状有问题。它必须是列向量。如果它也是像 (n,) 这样的行向量,那么只需将其重塑为带有 dx = dx.reshape((len(dx), 1)) 的列向量,那么它应该是 (n,1)
  • 现在可以用了,谢谢!!
猜你喜欢
  • 2021-05-02
  • 1970-01-01
  • 2021-02-14
  • 2021-02-09
  • 2013-11-12
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多