Python 复制数组会将数据从C_连续更改为F_连续 请考虑下面的例子: import numpy as np pos = np.random.rand(3,1000) k = np.random.randint(0,1000,1000) #this is just a random index to walk the array print pos.flags
前面的例子给出了:Python 复制数组会将数据从C_连续更改为F_连续 请考虑下面的例子: import numpy as np pos = np.random.rand(3,1000) k = np.random.randint(0,1000,1000) #this is just a random index to walk the array print pos.flags,python,arrays,numpy,Python,Arrays,Numpy,前面的例子给出了: C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False 如果使用先前定义的索引k复制数组,则会得到以下结果: pos_temp = pos[:,k] print pos_temp.flags 给出: C_CONTIGUOUS : False F_CONTIGUOUS : True OWNDATA : False
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
如果使用先前定义的索引k复制数组,则会得到以下结果:
pos_temp = pos[:,k]
print pos_temp.flags
给出:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
但是,如果按以下方式复制阵列:
pos_temp = np.ndarray([3,1000])
pos_temp[:,:] = pos[:,k]
print pos_temp.flags
我得到:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
如我所料。当我将数组传递给C子程序时,这有点烦人。所以,我的问题是:前面的例子有什么不同?为什么每个案例的行为都如此不同?这就是我所期望的,还是我遗漏了什么 简而言之,当您需要保证特定订单时,请使用
np.ascontiguousarray
(对于C订单)或np.asfortranarray
(对于F订单)。就目前的情况而言,C顺序是默认的,但是numpy中的一个常见习惯用法是交换轴,沿第一个轴应用,然后再交换回来。这可能就是这里正在发生的事情,尽管水平较低。另一种复制方式将对象强制转换为它们被分配到的数组的顺序np.take
将执行相同的操作并返回一个C-order数组,但当需要保证订单时,最好调用np.ascontiguousarray
。