Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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