numpy中ndarray的"ndim, shape, size, ..etc"身份是什么



我是Python的新手。

在使用Matlab很多年之后,最近,我开始学习numpy/scipy

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

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

我对c++/JAVA类很熟悉,但对Python OOP还是个新手。


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

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

接下来,我猜测它们可能是类似于c++中的getter方法的公共方法。然而,当我用括号尝试a.nidm()时,它不起作用。因此,它似乎不是一个公共方法。

另一种可能是它们是私有成员变量,但是but print a.ndim工作,所以它们不能是私有数据成员。

因此,我无法弄清楚上述属性的真正身份是什么。


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

你能给点建议吗?

numpyC代码和Python代码的混合实现。源代码可以在github上浏览,也可以作为git存储库下载。但是挖掘C源代码需要一些工作。许多文件被标记为.c.src,这意味着它们在编译之前要经过一层或多层的预处理。

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)
Ipython中的

x.<tab>显示了ndarray的所有补全。有4*18。有些是方法,有些是属性。x._<tab>显示了更多以__开始的内容。这些都是"私人的"——不打算供公众消费,但这只是语义上的。你可以查看它们并在需要时使用它们。

Off hand x.shape是我唯一设置的ndarray属性,即使这样,我通常也使用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)}

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.

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

关于你的第一个问题,Python对属性有语法糖,包括对获取、设置、删除它们的细粒度控制,以及对上述任何一项的限制。

例如,如果你有

class Foo(object):
    @property
    def shmip(self):
        return 3

则可以写入Foo().shmip以获得3,但是,如果这是类定义,则禁用设置Foo().shmip = 4

也就是说,这些都是只读属性

问题1

你提到的列表是一个包含Numpy数组属性的列表。

例如:

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

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

问题2

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

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

相关内容

  • 没有找到相关文章

最新更新