[Numpy-discussion] design issues - octave 'incompatibilities'
Chris Barker
Chris.Barker at noaa.gov
Mon Jul 25 09:01:03 CDT 2005
Soeren Sonnenburg wrote:
> -- why do vectors have no 'orientation', i.e. there are only row but no
> column vectors (or why do you treat matrices/vectors differently, i.e.
> have vectors at all as a separate type)
I think the key to understanding this is that NumPy uses a
fundamentally different data type that MATLAB ans it's derivatives.
MATLAB was originally just what it is called: a "Matrix" laboratory. The
basic data type of Matlab is a 2-d matrix. Even a scalar is really a 1X!
matrix. Matlab has a few tricks that can make these look like row and
column vectors, etc, but they are really always matrices.
On the other hand, NumPy arrays are N-dimensional, where N is
theoretically unlimited. In practice, I think the max N is defined and
compiled in, but you could change it and re-compile if you wanted. In
any case, many of us frequently use 3-d and higher arrays, and they can
be very useful. When thought of this way, you can see why there is no
such thing as a column vs. a row vector. A vector is a one-dimensional
array: it has no orientation.
However, NumPy does support NX1 and 1XN 2-d arrays which can be very handy:
>>> import numarray as N
>>> a = N.arange(5)
>>> a.shape = (1,-1)
>>> a
array([[0, 1, 2, 3, 4]])
>>> b = N.arange(5)
>>> b.shape = (-1,1)
>>> a
array([0, 1, 2, 3, 4])
>>> b
array([[0],
[1],
[2],
[3],
[4]])
So a is a row vector and b is a column vector. If you multiply them, you
get "array broadcasting":
>>> a * b
array([[ 0, 0, 0, 0, 0],
[ 0, 1, 2, 3, 4],
[ 0, 2, 4, 6, 8],
[ 0, 3, 6, 9, 12],
[ 0, 4, 8, 12, 16]])
This eliminates a LOT of extra duplicate arrays that you have to make in
Matlab with meshgrid.
When you index into an array, you reduce its rank (number of dimensions)
by 1:
>>> a = N.arange(27)
>>> a.shape = (3,3,3)
>>> a
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>> a.shape
(3, 3, 3)
>>> a[1].shape
(3, 3)
>>> a[1][1].shape
(3,)
When you slice, you keep the rank the same:
>>> a[1:2].shape
(1, 3, 3)
This creates a way to make row and column "vectors" from your 2-d array
(matrix)
>>> a = N.arange(25)
>>> a.shape = (5,5)
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
To make a "row vector" (really a 1XN matrix)
>>> a[0:1,:]
array([[0, 1, 2, 3, 4]])
To make a "column vector" (really a NX1 matrix)
>>> a[:,0:1]
array([[ 0],
[ 5],
[10],
[15],
[20]])
I hope that helps:
-Chris
--
Christopher Barker, Ph.D.
Oceanographer
NOAA/OR&R/HAZMAT (206) 526-6959 voice
7600 Sand Point Way NE (206) 526-6329 fax
Seattle, WA 98115 (206) 526-6317 main reception
Chris.Barker at noaa.gov
More information about the Numpy-discussion
mailing list