I have two numpy arrays of arrays (A and B). They look something like this when printed:
A:
[array([0, 0, 0]) array([0, 0, 0]) array([1, 0, 0]) array([0, 0, 0])
array([0, 0, 0]) array([0, 0, 0]) array([0, 0, 0]) array([0, 0, 0])
array([0, 0, 0]) array([0, 0, 0]) array([0, 0, 1]) array([0, 0, 0])
array([1, 0, 0]) array([0, 0, 1]) array([0, 0, 0]) array([0, 0, 0])
array([0, 0, 0]) array([1, 0, 0]) array([0, 0, 1]) array([0, 0, 0])]
B:
[[ 4.302135e-01 4.320091e-01 4.302135e-01 4.302135e-01
1.172584e+08]
[ 4.097128e-01 4.097128e-01 4.077675e-01 4.077675e-01
4.397120e+07]
[ 3.796353e-01 3.796353e-01 3.778396e-01 3.778396e-01
2.643200e+07]
[ 3.871173e-01 3.890626e-01 3.871173e-01 3.871173e-01
2.161040e+07]
[ 3.984899e-01 4.002856e-01 3.984899e-01 3.984899e-01
1.836240e+07]
[ 4.227315e-01 4.246768e-01 4.227315e-01 4.227315e-01
1.215760e+07]
[ 4.433817e-01 4.451774e-01 4.433817e-01 4.433817e-01
9.340800e+06]
[ 4.620867e-01 4.638823e-01 4.620867e-01 4.620867e-01
1.173760e+07]]
type(A)
, type(A[0])
, type(B)
, type(B[0])
are all <class 'numpy.ndarray'>
.
However, A.shape
is (20,)
, while B.shape
is (8, 5)
.
Question 1: Why is A.shape
one-dimensional, and how do I make it two-dimensional like B.shape
? They're both arrays of arrays, right?
Question 2, possibly related to Q1: Why does printing A
show the calls of array()
, while printing B
doesn't, and why do the elements of the subarrays of B
not have commas in-between them?
Thanks in advance.
Shape of an Array The shape is a tuple of integers.
One dimensional array contains elements only in one dimension. In other words, the shape of the NumPy array should contain only one value in the tuple.
NumPy arrays have an attribute called shape that returns a tuple with each index having the number of corresponding elements.
NumPy array is a powerful N-dimensional array object and its use in linear algebra, Fourier transform, and random number capabilities.
A.dtype
is O
, object, B.dtype
is float
.
A
is a 1d array that contains objects, which happen to be arrays. They could just as well be lists or None`.
B
is a 2d array of floats. Indexing one row of B
gives a 1d array.
So A[0]
and B[0]
can appear to produce the same thing, but the selection process is different.
Try np.concatenate(A)
, or np.vstack(A)
. Both of these then treat A
as a list of arrays, and join them either in 1 or 2d.
Converting object arrays to regular comes up quite often.
Converting a 3D List to a 3D NumPy array is a little more general that what you need, but gives a lot of useful information.
also
Convert a numpy array of lists to a numpy array
==================
In [28]: A=np.empty((5,),object)
In [31]: A
Out[31]: array([None, None, None, None, None], dtype=object)
In [32]: for i in range(5):A[i]=np.zeros((3,),int)
In [33]: A
Out[33]:
array([array([0, 0, 0]), array([0, 0, 0]), array([0, 0, 0]),
array([0, 0, 0]), array([0, 0, 0])], dtype=object)
In [34]: print(A)
[array([0, 0, 0]) array([0, 0, 0]) array([0, 0, 0]) array([0, 0, 0])
array([0, 0, 0])]
In [35]: np.vstack(A)
Out[35]:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
np.stack(A)
can join the arrays on a new leading axis.
If the subarrays differ in shape, these 'stack' functions will raise an error. It's up to you to find the problem array(s).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With