【问题标题】:Error on crossing two numpy (vector defined function) arrays in SAGE在 SAGE 中交叉两个 numpy(向量定义函数)数组时出错
【发布时间】:2014-12-28 16:56:23
【问题描述】:

u=u(x),v=v(x)为SAGE中定义的两个向量函数,如下:

import numpy as np
x = var('x')
f,g = function('f',x), function('g',x)
f(x), g(x) = 2*x, sin(x)
u,v = np.array([f,g]),np.array([g,f])
c = np.cross(u,v)

当试图穿越u,v 时,我收到以下错误(这似乎很奇怪,因为np.dot(u,v) 工作正常)

错误:

sage: np.cross(u,v,axisa=0,axisb=0)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-4f0f99d7c55e> in <module>()
----> 1 np.cross(u,v,axisa=Integer(0),axisb=Integer(0))

/usr/lib/sagemath/local/lib/python2.7/site-packages/numpy/core/numeric.py in cross(a, b, axisa, axisb, axisc, axis)
   1329         if (b.shape[0] == 2):
   1330             cp = a[0]*b[1] - a[1]*b[0]
-> 1331             if cp.ndim == 0:
   1332                 return cp
   1333             else:

/usr/lib/sagemath/local/lib/python2.7/site-packages/sage/structure/element.so in sage.structure.element.Element.__getattr__ (sage/structure/element.c:3846)()

AttributeError: 'sage.symbolic.expression.Expression' object has no attribute 'ndim'

更新(解决方案):在 3D 向量上使用 SAGE 的 u.cross_product(v)

【问题讨论】:

  • 再澄清一下,你的f,g=... 行可能不会做任何事情,因为下一行将覆盖它,并且假设你有 symbolic 元素 @987654328 @无论如何,Numpy 不太可能真的能够用它们做很多事情。如果您正在寻找“纯 Python”解决方案,Sympy 应该有很多您正在寻找的东西(并且是 Sage 中的内置标准)。祝你好运!

标签: python arrays numpy sage


【解决方案1】:

由于ab 的第一个dim 是2,它正在计算

cp = a[0]*b[1] - a[1]*b[0]

对于一个普通的 numpy 数组,这很好用:

np.cross([1,2],[2,1])  # -3

因为

np.array([1,2])[0].ndim  # 0

我没有 Sage,但您的错误消息说数组的元素是 sage.symbolic.expression.Expression 对象。

我可以使用 dtype=object 用其他数组重现您的错误:

In [79]: f=np.array((1,2),dtype='O')  # array([1, 2], dtype=object)
In [80]: g=np.array((2,1),dtype='O')

In [83]: np.cross(f,g)
...
-> 1501             if cp.ndim == 0:
   1502                 return cp
   1503             else:

AttributeError: 'int' object has no attribute 'ndim'

In [84]: np.dot(f,g)
Out[84]: 4

In [86]: f[0]
Out[86]: 1

In [87]: f[0].ndim
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-87-45759919b9dd> in <module>()
----> 1 f[0].ndim

AttributeError: 'int' object has no attribute 'ndim'

显然,在编写np.cross 时,他们并没有期望它会与对象数组一起使用。此测试会产生错误的那些:if cp.ndim == 0:

【讨论】:

  • ΟΚ,明白了!但是为什么其他操作(在 sage 函数对象上)是可能的?例如,如前所述,np.dot(u,v) 完美运行
  • 你的 Sage 对象和我的测试对象在索引时都返回一个数字 (a[0]),它只是没有包含在 numpy 类型中(即 Python int 而不是 np.int8 )。出于许多目的,它们的行为相同。恰好np.cross 选择了ndim==0 来区分标量和数组结果。
猜你喜欢
  • 2021-08-04
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2011-07-17
  • 2021-08-03
  • 2013-08-31
  • 1970-01-01
相关资源
最近更新 更多