我是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。我在哪里可以找到ndarray
的Python代码实现?由于我在本地PC上安装了numpy / scipy,我想可能有一些方法可以查看源代码,然后我认为一切都可能很清楚。
你能就此提出一些建议吗?
答案 0 :(得分: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)
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
。
答案 1 :(得分:3)
关于你的第一个问题,Python有properties的语法糖,包括获取,设置,删除它们的细粒度控制,以及限制上述任何一个。
所以,例如,如果你有
class Foo(object):
@property
def shmip(self):
return 3
然后您可以编写Foo().shmip
来获取3
,但是,如果这是类定义,则您已禁用设置Foo().shmip = 4
。
换句话说,那些是只读属性。
答案 2 :(得分:1)
问题1
您提到的列表包含Numpy数组的属性。
例如:
a = np.array([1, 2, 3])
print(type(a))
>><class 'numpy.ndarray'>
由于a
是nump.ndarray,因此您可以使用这些属性来了解有关它的更多信息。 (即a.size
将导致3)。要获取有关每个人所执行操作的信息,请访问有关属性的SciPy's文档。
问题2
您可以启动here以熟悉Numpy的一些基础工具以及Reference Manual,假设您使用的是v1.9。有关Numpy Array的特定信息,您可以转到Array Objects。
他们的文档非常广泛且非常有用。整个网站提供了一些示例,显示了多个示例。