获得满足特定形状和步幅约束的ndarray视图

时间:2015-02-11 04:49:57

标签: python numpy

如果我有一个numpy ndarray,请说A,其数据缓冲区是C-contiguous。现在我想得到这个矩阵的视图,有已知的偏移,形状和步幅,我该怎么做?

例如,如果我有:

import numpy
A = numpy.zeros((100, 100))

假设我想得到一个矩阵B,它是A的视图,其偏移量相对于A为880字节,并且具有形状(10,20)和大步(8,800),我可以做到以下几点:

B = A[1:21, 10:20].T

是否有一种方法可以在一般情况下获得这样的视图矩阵?我想有三种可能的方法,其中任何一种对我都有好处:

  1. 提出一系列转换来构建视图矩阵的一般过程B
  2. 构造一个ndarray,其中包含手动指定的起始地址,偏移量,形状和步幅?
  3. 我在C ++中有上述四件事,所以我也可以调用Python C API构建这样一个ndarray。
  4. 顺便说一下,我还想知道B的哪个属性记录了它相对于A起始地址的偏移量?

3 个答案:

答案 0 :(得分:2)

如果您想要完全控制所有内容,可以直接使用np.ndarray构造函数,并执行以下操作:

B = np.ndarray(shape=(10, 20), dtype=A.dtype, buffer=A, offset=880,
               strides=(8, 800))

答案 1 :(得分:1)

In [53]: A.__array_interface__
Out[53]: 
{'data': (173143872, False),
 'descr': [('', '<f8')],
 'shape': (100, 100),
 'strides': None,
 'typestr': '<f8',
 'version': 3}

In [54]: B.__array_interface__
Out[54]: 
{'data': (173144752, False),
 'descr': [('', '<f8')],
 'shape': (10, 20),
 'strides': (8, 800),
 'typestr': '<f8',
 'version': 3}

data指针值之间的差异是880。

答案 2 :(得分:0)

谢谢大家提供有用的解决方案。我最终做的是实际调用PyArray_SimpleNewFromData,然后使用PyArray_STRIDES就地修改步幅。我可以调用PyArray_New来设置调用的所有参数,但我不知道如何设置标志等。