【问题标题】:Python 3.8 numpy array subtractionPython 3.8 numpy 数组减法
【发布时间】:2020-06-04 12:36:29
【问题描述】:

更新: u_n = u[n,:].copy() 解决了这个问题。谢谢大家提出宝贵的建议。建议修复的答案已标记。


我有一个生成两个数组的代码:

u_n = [0.00000000e+00 -3.55754723e-04 -5.83161988e-04 -7.28203241e-04
 -8.20386731e-04 -8.78649151e-04 -9.15142981e-04 -9.37666984e-04
 -9.51225955e-04 -9.59031686e-04 -9.63145318e-04 -9.64889573e-04
 -9.65113299e-04 -9.64361236e-04 -9.62982969e-04 -9.61202840e-04...]

u = [ 0.00000000e+00 -5.71470888e-04 -9.86586605e-04 -1.28338884e-03
 -1.49272978e-03 -1.63854091e-03 -1.73883197e-03 -1.80686241e-03
 -1.85223351e-03 -1.88180768e-03 -1.90043862e-03 -1.91152978e-03
 -1.91745053e-03 -1.91984028e-03 -1.91982739e-03 -1.91818493e-03
 -1.91544043e-03 -1.91195258e-03 -1.90796453e-03 -1.90364059e-03...]

我正在使用np.subtract 减去这两个数组(也尝试减去像u-u_n 这样的单个元素)。 Python 正在计算(不仅仅是打印)每个元素的结果为 0!这影响了我的代码的收敛性。

如何正确使用算术?提前致谢。

编辑: 非零结果是预期的,因为两个数组的元素之间存在一些差异。 然而,Python 会为 np.subtract(u-u_n) 返回 [0,0,0,0,......,0]。我的代码如下。

# Compute b and solve linear system
print(u_n)
for i in range(1, Nx, 1):
    b[i] = u_n[i]-(k*np.cos(t[n])*(L-x[i]))/L

    b[0] = 0; b[Nx] = 0
    u[n,:] = scipy.sparse.linalg.spsolve(A, b)
    u[n,0] = 0; u[n,Nx] = 0
    print(u[n,:])

    R = np.subtract(u[n,:],u_n)/k
    print(R)
    R = R**2
    R2 = np.sum(R)
    R2 = np.sqrt(R2)
    print ('R2 = %.9f' %R2)

    #Update u_n before next step

    u_n = u[n,:]

输出:

u_n = [ 0.00000000e+00 -3.55754723e-04 -5.83161988e-04 -7.28203241e-04
 -8.20386731e-04 -8.78649151e-04 -9.15142981e-04 -9.37666984e-04
 -9.51225955e-04 -9.59031686e-04 -9.63145318e-04 -9.64889573e-04
 -9.65113299e-04 -9.64361236e-04 -9.62982969e-04 -9.61202840e-04
 -9.59164819e-04 -9.56961297e-04 -9.54651567e-04 -9.52273679e-04....]

u = [ 0.00000000e+00 -5.71470888e-04 -9.86586605e-04 -1.28338884e-03
 -1.49272978e-03 -1.63854091e-03 -1.73883197e-03 -1.80686241e-03
 -1.85223351e-03 -1.88180768e-03 -1.90043862e-03 -1.91152978e-03
 -1.91745053e-03 -1.91984028e-03 -1.91982739e-03 -1.91818493e-03
 -1.91544043e-03 -1.91195258e-03 -1.90796453e-03 -1.90364059e-03...]

# R = u - u_n

R = [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ....]

【问题讨论】:

  • 嗨,你想达到什么目的?预期的结果是什么?你用了什么代码?请提供 MRE (stackoverflow.com/help/minimal-reproducible-example)
  • 你能提供一个关于你有什么问题的代码 sn-p 吗?
  • @YasserMohsen 对于我的 coed,输出 R = u-u_n,不应该是 0,但这就是 Python 生成的。
  • 在调用np.subtract 之前尝试打印u[n,:]u_n。这些变量可能在内存中存在别名
  • 所以只是为了确保 - 您正在迭代解决一个问题,即您的 R 是新 (u[n,:]) 和前一个 (u_n) 步骤之间的差异。除了@tstanisl 的建议之外,您的初始条件是什么? u_n 你是从哪个开始的?

标签: python numpy floating-point


【解决方案1】:

尝试换行

u_n = u[n,:]

u_n = u[n,:].copy()

切片会创建一个视图,因此修改视图也会修改原始数组,反之亦然。 由于两个数组都指向相同的数据,因此差异是一堆零。 该问题可以通过在提取u_n的同时应对数据来解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多