我试图在不复制的情况下将 2D ndarray 视为记录或结构化数组。a
如果拥有它的数据,这似乎工作正常
>>> a = np.array([[ 1, 391, 14, 26],
[ 17, 371, 15, 30],
[641, 340, 4, 7]])
>>> b = a.view(zip('abcd',[a.dtype]*4))
array([[(1, 391, 14, 26)],
[(17, 371, 15, 30)],
[(641, 340, 4, 7)]],
dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8'), ('d', '<i8')])
>>> b.base is a
True
但如果a
已经是一个视图,则失败。这是一个例子
>>> b = a[:,[0,2,1,3]]
>>> b.base is None
False
>>> b.view(zip('abcd',[a.dtype]*4))
ValueError: new type not compatible with array.
有趣的是,在这种情况下b.base
是视图的转置
>>> (b.base == b.T).all()
True
因此,numpy 无法创建我想要的视图是有道理的。
但是,如果我使用
>>> b = np.take(a,[0,2,1,3],axis=1)
这导致b
成为数据的正确副本,以便采用recarray 视图。附带问题:有人可以用花哨的索引来解释这种行为吗?
我的问题是,我是不是走错了路?不支持以我的方式进行查看吗?如果是这样,那么正确的方法是什么?