我试图将2D ndarray视图作为记录或结构化阵列进行复制。这似乎很好地工作,如果a
拥有它的数据获取ndarray的重新阵列视图(也可以是视图)
>>> 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观点的作品。侧面问题:有人可以解释这种行为与花式索引相反吗?
我的问题是,我这样做是错误的吗?正在考虑我不支持的方式吗?如果是这样,那么正确的做法是什么?
谢谢!我不知道内存布局可能会这样改变。清楚的是,我知道索引像'a [:,[0,2,1,3]'会返回一个副本,但我不知道它可能是'F_CONTIGOUS'或'np.take'会总是返回一个'C_CONTIGUOUS'(这个numpy文档说''np.take'与花式索引做同样的事情,这在这个例子中似乎是错误的)。你会如何处理这种特殊的观点(没有复制),并且始终有效?检查数组是否为'F \ C_CONTIGOUS'是不好的做法吗? – toes