numpy.shape gives inconsistent responses - why?

后端 未结 4 1494
执笔经年
执笔经年 2021-02-04 03:29

Why does the program

import numpy as np

c = np.array([1,2])
print(c.shape)
d = np.array([[1],[2]]).transpose()
print(d.shape)

give

<         


        
相关标签:
4条回答
  • 2021-02-04 04:13

    len(c.shape) is the "depth" of the array.

    For c, the array is just a list (a vector), the depth is 1.
    For d, the array is a list of lists, the depth is 2.

    Note:

    c.transpose()
    # array([1, 2])
    

    which is not d, so this behaviour is not inconsistent.

    dt = d.transpose()
    # array([[1],
    #        [2]])
    dt.shape # (2,1)
    
    0 讨论(0)
  • 2021-02-04 04:19

    When you invoke the .shape attribute of a ndarray, you get a tuple with as many elements as dimensions of your array. The length, ie, the number of rows, is the first dimension (shape[0])

    • You start with an array : c=np.array([1,2]). That's a plain 1D array, so its shape will be a 1-element tuple, and shape[0] is the number of elements, so c.shape = (2,)
    • Consider c=np.array([[1,2]]). That's a 2D array, with 1 row. The first and only row is [1,2], that gives us two columns. Therefore, c.shape=(1,2) and len(c)=1
    • Consider c=np.array([[1,],[2,]]). Another 2D array, with 2 rows, 1 column: c.shape=(2,1) and len(c)=2.
    • Consider d=np.array([[1,],[2,]]).transpose(): this array is the same as np.array([[1,2]]), therefore its shape is (1,2).

    Another useful attribute is .size: that's the number of elements across all dimensions, and you have for an array c c.size = np.product(c.shape).

    More information on the shape in the documentation.

    0 讨论(0)
  • 2021-02-04 04:23

    Quick Fix: check the .ndim property - if its 2, then the .shape property will work as you expect.

    Reason Why: if the .ndim property is 2, then numpy reports a shape value that agrees with the convention. If the .ndim property is 1, then numpy just reports shape in a different way.

    More talking: When you pass np.array a lists of lists, the .shape property will agree with standard notions of the dimensions of a matrix: (rows, columns).

    If you pass np.array just a list, then numpy doesn't think it has a matrix on its hands, and reports the shape in a different way.

    The question is: does numpy think it has a matrix, or does it think it has something else on its hands.

    0 讨论(0)
  • 2021-02-04 04:27

    transpose does not change the number of dimensions of the array. If c.ndim == 1, c.transpose() == c. Try:

    c = np.array([1,2])
    print c.shape
    print c.T.shape
    c = np.atleast_2d(c)
    print c.shape
    print c.T.shape
    
    0 讨论(0)
提交回复
热议问题