【发布时间】:2018-05-24 17:37:31
【问题描述】:
TL;DR:
我正在寻找一种方法来获得 numpy ndarray 的非平凡的,特别是非连续的视图。
例如,给定一个 1D ndarray x = np.array([1, 2, 3, 4]),有没有办法获得它的非平凡视图,例如np.array([2, 4, 3, 1])?
加长版
问题的上下文如下:我有一个形状为 (U, V, S, T) 的 4D ndarray,我想以非平凡的方式将其重塑为形状为 (U*S, V*T) 的 2D ndarray,即简单的 np.reshape()没有做到这一点,因为我有一个更复杂的索引方案,其中重新调整的数组在内存中不会是连续的。就我而言,数组相当大,我想获得一个视图而不是数组的副本。
示例
给定一个数组x(u, v, s, t)的形状(2, 2, 2, 2):
x = np.array([[[[1, 1], [1, 1]],[[2, 2], [2, 2]]],
[[[3, 3], [3, 3]], [[4, 4], [4, 4]]]])
我想获取数组的视图 z(a, b):
np.array([[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]])
这对应于a = u * S + s 和b = v * T + t 的索引方案,在本例中为S = 2 = T。
我尝试过的
使用
np.reshape甚至as_strided的各种方法。进行标准整形不会改变元素在内存中出现的顺序。我尝试使用order='F'并转置一点,但不知道哪个给了我正确的结果。由于我知道索引方案,我尝试使用
np.ravel()对数组的平面视图进行操作。我的想法是按照所需的索引方案创建一个索引数组并将其应用于展平的数组视图,但不幸的是,花式/高级索引提供了数组的副本,而不是视图。
问题
有什么方法可以实现我正在寻找的索引视图?
原则上,我认为这应该是可能的,例如ndarray.sort() 对数组执行就地非平凡索引。另一方面,这可能是在 C/C++ 中实现的,所以在纯 Python 中甚至可能无法实现?
【问题讨论】:
标签: python arrays numpy numpy-ndarray