python – numpy – 将非连续数据转换为适当的连续数据
请考虑以下代码: import numpy as np a = np.zeros(50) a[10:20:2] = 1 b = c = a[10:40:4] print b.flags # You'll see that b and c are not C_CONTIGUOUS or F_CONTIGUOUS 我的问题: 有没有办法(只提到b)使b和c连续? 接近但不太合理的事情是:np.ascontiguousarray / np.asfortranarray,因为它们将返回一个新数组. 我的用例是我有一个非常大的3D字段存储在numpy.ndarray的子类中.为了节省内存,我想将这些字段切换到我实际感兴趣处理的域的部分: a = a[ix1:ix2,iy1:iy2,iz1:iz2] 切片为子类比切片ndarray对象更受限制,但这应该有效并且它将“做正确的事情” – 附加在子类上的各种自定义元数据将按预期转换/保留.不幸的是,由于这会返回一个视图,numpy之后不会释放大数组,所以我实际上并没有在这里保存任何内存. 要完全清楚,我希望完成两件事: >保留我的类实例上的元数据.切片会起作用,但我不确定其他形式的复制. 解决方法你可以在cython中做到这一点:In [1]: %load_ext cythonmagic In [2]: %%cython cimport numpy as np np.import_array() def to_c_contiguous(np.ndarray a): cdef np.ndarray new cdef int dim,i new = a.copy() dim = np.PyArray_NDIM(new) for i in range(dim): np.PyArray_STRIDES(a)[i] = np.PyArray_STRIDES(new)[i] a.data = new.data np.PyArray_UpdateFlags(a,np.NPY_C_CONTIGUOUS) np.set_array_base(a,new) In [8]: import sys import numpy as np a = np.random.rand(10,10,10) b = c = a[::2,1::3,2::4] d = a[::2,2::4] print sys.getrefcount(a) to_c_contiguous(b) print sys.getrefcount(a) print np.all(b==d) 输出是: 4 3 True to_c_contiguous(a)将创建a的c_contiguous副本,并将其作为a的基础. 在调用to_c_contiguous(b)之后,a的refcount减少,当a的refcount变为0时,它将被释放. (编辑:哈尔滨站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- python – 与布尔numpy数组VS PEP8 E712的比较
- Python:从字符串中删除重复字符的最佳方式
- python – 如何在数据帧中划分两列
- 范围 – Python的非本地取决于层次结构的级别?
- python – Django – get_or_create无效
- django-forms – 如何使用modelformset_factory创建一个空的
- python – 编写一个通用的getattr()并根据attr名称填充方法
- 在IPython中使用Interactive Shell之外的魔术命令
- python – Tkinter Canvas将项目移动到顶层
- python-2.7 – Sphinx的LaTeX错误:找不到文件`titlesec.st