|
From: <co...@ph...> - 2005-08-15 23:38:48
|
Greg Ewing <gre...@ca...> writes:
> Nadav Horesh wrote:
>> Gary Ruben <gr...@bi...>:
>>
>> > Just browsing through the new array PEP to see if there's support
>> for > 3-vector operations, such as cross product, norm, length
>> functions.
>> > Sadly I don't see any.
>>
>> Usually this is within the scope of higher level packages such as
>> ScientificPython.
>
> I'd like to see at least cross product included somewhere,
> since it's difficult to synthesize efficiently from the
> other operations provided.
I agree. I've added a cross_product() funtion to Numeric in CVS. It'll
do the cross product along any axes of the arrays passed, assuming
that they're of dimensions 2 or 3 (a 2d cross-product returns the
z-component of the equivalent 3d one).
The test cases look like this:
a = Numeric.array([1,2,3])
b = Numeric.array([4,5,6])
assert_eq(Numeric.cross_product(a,b), [-3, 6, -3])
a = Numeric.array([1,2])
b = Numeric.array([4,5])
assert_eq(Numeric.cross_product(a,b), -3)
a = Numeric.array([[1,2,3], [4,5,6]])
b = Numeric.array([7, 8, 9])
assert_eq(Numeric.cross_product(a,b), [[-6,12,-6],[-3,6,-3]])
a = Numeric.array([[1,2,3], [4,5,6]])
b = Numeric.array([[10,11,12], [7,8,9]])
assert_eq(Numeric.cross_product(a,b,axis1=0,axis2=0), [-33,-39,-45])
assert_eq(Numeric.cross_product(a,b), [[-9,18,-9], [-3,6,-3]])
and the calling sequence like this:
def cross_product(a, b, axis1=-1, axis2=-1):
"""Return the cross product of two vectors.
The cross product is performed over the last axes of a and b by default,
and can handle axes with dimensions 2 and 3. For a dimension of 2,
the z-component of the equivalent three-dimensional cross product is
returned.
"""
Someone else can make the infix-operator module :-)
--
|>|\/|<
/--------------------------------------------------------------------------\
|David M. Cooke http://arbutus.physics.mcmaster.ca/dmc/
|co...@ph...
|