在numpy中ndarray的"ndim,shape,size,.. etc"的标识是什么?

cha*_*com 4 python numpy multidimensional-array

我是Python的新手.

在使用Matlab多年之后,最近,我开始研究numpy/scipy

似乎numpy最基本的元素似乎是ndarray.在ndarray中,有以下属性:

  • ndarray.ndim
  • ndarray.shape
  • ndarray.size
  • ...等等

我对C++/JAVA类非常熟悉,但我是Python OOP的新手.


Q1:我的第一个问题是上述属性的身份是什么?

首先,我假设上面的属性可能是公共成员变量.但很快,我发现这a.ndim = 10不起作用(假设a是一个对象ndarray)所以,它似乎不是一个公共成员变量.

接下来,我猜测它们可能是类似于C++中的getter方法的公共方法.但是,当我尝试a.nidm()使用括号时,它不起作用.所以,它似乎不是一种公共方法.

另一种可能是它们是私有成员变量,但是打印a.ndim工作,因此它们不能是私有数据成员.

所以,我无法弄清楚上述属性的真实身份是什么.


Q2.我在哪里可以找到Python代码的实现ndarray?由于我在我的本地PC上安装了numpy/scipy,我想可能有一些方法来查看源代码,然后我认为一切都可能很清楚.

你能就此提出一些建议吗?

hpa*_*ulj 5

numpy实现为C代码和Python代码的混合.源可用于浏览github,可以作为git存储库下载.但是挖掘你的方式C需要一些工作.许多文件被标记为.c.src,这意味着它们在编译之前会通过一个或多个perprocessing层.

Python也是用C和Python混合编写的.所以不要试图强迫事物进入C++术语.

最好利用您的MATLAB经验,调整以允许Python.并且numpy有许多超越Python的怪癖.它使用的是Python语法,但由于它有自己的C代码,因此它不仅仅是一个Python类.

我用Ipython我平常的工作环境.有了它,我可以foo?用来查看文档foo(与Python相同help(foo),并foo??查看代码 - 如果它是用Python编写的(如MATLAB/Octave type(foo))

Python对象具有属性和方法.也properties看起来像属性,但实际上使用方法来获取/设置.通常,您不需要了解属性和属性之间的区别.

 x.ndim   # as noted, has a get, but no set; see also np.ndim(x)
 x.shape   # has a get, but can also be set; see also np.shape(x)
Run Code Online (Sandbox Code Playgroud)

x.<tab>在Ipython中向我展示了a的所有完成情况ndarray.有4*18.一些是方法,一些属性. x._<tab>展示了一堆更多的东西__.这些都是"私人" - 不是为了公共消费,而是仅仅是语义.您可以查看它们并在需要时使用它们.

x.shapendarray我设置的唯一属性,即使是我经常使用的属性reshape(...).阅读他们的文档,看看差异. ndim是维度的数量,直接更改它是没有意义的.它是len(x.shape); 改变形状以改变ndim.同样x.size不应该是你直接改变的东西.

其中一些属性可通过函数访问. np.shape(x) == x.shape,类似于MATLAB size(x).(MATLAB没有.属性语法).

x.__array_interface__ 是一个方便的属性,它给出了一个包含许多属性的字典

In [391]: x.__array_interface__
Out[391]: 
{'descr': [('', '<f8')],
 'version': 3,
 'shape': (50,),
 'typestr': '<f8',
 'strides': None,
 'data': (165646680, False)}
Run Code Online (Sandbox Code Playgroud)

对于文档ndarray(shape, dtype=float, buffer=None, offset=0, strides=None, order=None)__new__方法列出了这些属性:

`Attributes
----------
T : ndarray
    Transpose of the array.
data : buffer
    The array's elements, in memory.
dtype : dtype object
    Describes the format of the elements in the array.
flags : dict
    Dictionary containing information related to memory use, e.g.,
    'C_CONTIGUOUS', 'OWNDATA', 'WRITEABLE', etc.
flat : numpy.flatiter object
    Flattened version of the array as an iterator.  The iterator
    allows assignments, e.g., ``x.flat = 3`` (See `ndarray.flat` for
    assignment examples; TODO).
imag : ndarray
    Imaginary part of the array.
real : ndarray
    Real part of the array.
size : int
    Number of elements in the array.
itemsize : int
    The memory use of each array element in bytes.
nbytes : int
    The total number of bytes required to store the array data,
    i.e., ``itemsize * size``.
ndim : int
    The array's number of dimensions.
shape : tuple of ints
    Shape of the array.
strides : tuple of ints
    The step-size required to move from one element to the next in
    memory. For example, a contiguous ``(3, 4)`` array of type
    ``int16`` in C-order has strides ``(8, 2)``.  This implies that
    to move from element to element in memory requires jumps of 2 bytes.
    To move from row-to-row, one needs to jump 8 bytes at a time
    (``2 * 4``).
ctypes : ctypes object
    Class containing properties of the array needed for interaction
    with ctypes.
base : ndarray
    If the array is a view into another array, that array is its `base`
    (unless that array is also a view).  The `base` array is where the
    array data is actually stored.
Run Code Online (Sandbox Code Playgroud)

所有这些应该被视为属性,但我认为numpy实际上并不使用该property机制.一般来说,它们应被视为"只读".此外shape,我只记得改变data(指向数据缓冲区的指针),和strides.


Leb*_*Leb 1

问题1

您提到的列表包含 Numpy 数组的属性。

例如:

a = np.array([1, 2, 3])
print(type(a))
>><class 'numpy.ndarray'>
Run Code Online (Sandbox Code Playgroud)

由于a是 nump.ndarray 您可以使用这些属性来了解有关它的更多信息。(即a.size结果为 3)。要获取有关每个属性的信息,请访问SciPy有关属性的文档。

问题2

您可以从这里开始熟悉 Numpy 的一些基础工具以及参考手册 (假设您使用的是 v1.9)。有关 Numpy Array 的特定信息,您可以访问Array Objects

他们的文档非常广泛并且非常有帮助。整个网站提供了示例,显示了多个示例。