有可能用符号索引numpy数组吗?

2024-06-02 05:06:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对一个像这样的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数组的索引来处理?如果没有,你能给我一个解决办法吗? 谢谢。在


Tags: importnumpytruereadasnpsomeinteger
2条回答

矩阵符号仅限于二维矩阵。推广到数组 任何维度,都可以使用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

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

相反,使用SymPy对象以符号方式创建所需的东西,然后lambdify它。numpy数组的SymPy版本是IndexedBase,但它似乎有一个bug,因此,由于数组是二维的,所以也可以使用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),而不是{})。在

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

相关问题 更多 >