如果我有一个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
是否有一种方法可以在一般情况下获得这样的视图矩阵?我想有三种可能的方法,其中任何一种对我都有好处:
B
?顺便说一下,我还想知道B
的哪个属性记录了它相对于A
起始地址的偏移量?
答案 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
来设置调用的所有参数,但我不知道如何设置标志等。