【问题标题】:Is it possible to index numpy array with sympy symbols?是否可以用 sympy 符号索引 numpy 数组?
【发布时间】:2016-03-29 10:49:03
【问题描述】:

我想对这样的 numpy 数组做一些求和

import numpy as np
import sympy as sy
import cv2

i, j = sy.symbols('i j', Integer=True)
#next read some grayscale image to create a numpy array of pixels  
a = cv2.imread(filename)
b = sy.summation(sy.summation(a[i][j], (i,0,1)), (j,0,1)) #double summation

但我遇到了一个错误。是否可以将 numpy 符号处理为 numpy 数组的索引?如果没有,你能给我一个解决方案吗? 谢谢。

【问题讨论】:

  • 为什么需要使用符号求和?您想为这些符号使用任何属性吗?在我看来,您需要的是正常的求和:sum(sum(a))。内部sum 对列求和,第二对行求和。如果你对反向感兴趣,可以改用sum(sum(a.transpose())
  • juandesat 说我有一个像素数组,其形状 (row,col) 由一个 numpy 数组表示,接下来我将它分成 3*3 像素块,以每个 P(i,j) 为中心,其中 P (i,j) 是整个 numpy 数组中 (i,j) 处的像素。我想要的是计算每个 3*3 块图像的平均像素值作为 P(i,j) 的新值,因此“i”和“j”将是动态的。该数组只是一个示例,但我是什么使用 sympy 符号作为 numpy 数组的索引。谢谢
  • 我什至可以从另一个方向问我的问题:例如,是否可以将 sympy 符号的值作为 python 整数值获取?
  • @NarcisseDoudieuSiewe SymPy 函数通常在 SymPy 对象上运行,例如Symbol 实例。通常你象征性地制定一个方程,然后使用例如生成一个回调。 lambdify 然后可以对 numpy 数组进行操作。

标签: python numpy sympy


【解决方案1】:

你不能在 SymPy 表达式中直接使用 numpy 对象,因为 numpy 对象不知道如何处理符号变量。

相反,使用 SymPy 对象象征性地创建您想要的东西,然后 lambdify 它。 numpy 数组的 SymPy 版本是 IndexedBase,但它似乎有一个错误,因此,由于您的数组是二维的,您也可以使用 MatrixSymbol。

In [49]: a = MatrixSymbol('a', 2, 2) # Replace 2, 2 with the size of the array

In [53]: i, j = symbols('i j', integer=True)

In [50]: f = lambdify(a, Sum(a[i, j], (i, 0, 1), (j, 0, 1)))

In [51]: b = numpy.array([[1, 2], [3, 4]])

In [52]: f(b)
Out[52]: 10

(还要注意创建整数符号的正确语法是symbols('i j', integer=True),而不是symbols('i j', Integer=True))。

请注意,您必须使用 a[i, j] 而不是 a[i][j],这是不受支持的。

【讨论】:

    【解决方案2】:

    MatrixSymbol 仅限于二维矩阵。泛化到数组 任何维度,您都可以使用IndexedBase 生成表达式。 lambdify 是 目前与IndexedBase不兼容,但可以与 DeferredVectors。所以诀窍是将DeferredVector 传递给lambdify

    import sympy as sy
    import numpy as np
    
    a = sy.IndexedBase('a')
    i, j, k = sy.symbols('i j k', integer=True)
    s = sy.Sum(a[i, j, k], (i, 0, 1), (j, 0, 1), (k, 0, 1))
    f = sy.lambdify(sy.DeferredVector('a'), s)
    b = np.arange(24).reshape(2,3,4)
    
    result = f(b)
    expected = b[:2,:2,:2].sum()
    assert expected == result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-06
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多